TCP/IP总结

来源:互联网 发布:没有违法淘宝规则 编辑:程序博客网 时间:2024/06/16 19:15

首先了解一下OSI七层协议和TCP/IP四层协议:
这里写图片描述
TCP连接的任意一端都是状态机
属于传输层协议

1、TCP和UDP的区别:

TCP为全双工通信,可靠交付,面向连接,字节流
TCP模块发出的TCP报文段的个数和应用程序接受的次数和顺序没有固定的关系,因为接收端会进行重排。
TCP会丢弃重复的数据。
TCP发送一个段后,它启动一个定时器,如果不能及时收到一个确认,将重发这个报文段。
这里写图片描述
UDP为为数据报,无连接,不可靠交付。
udp发送端应用程序每写一次,udp就发送一次,接收端必须对每一个udp数据执行读操作,否则就会丢包。

2、TCP头部
这里写图片描述
序号是用来标识TCP发送端想发给TCP接收端的数据字节流,它表示在这个报文段中的第一个数据字节,TCP用需要对每个字节进行计数。
确认序号包含发送确认的一端所期望收到的下一个序号,确认序号是上次已成功收到的数据字节序号加1。
TCP的流量控制由连接的每一端通过声明的窗口大小来提供,这个值是接收端正期望接收的字节。窗口大小是一个16位的字段,所以窗口大小最大是65535字节,新的窗口扩大选项允许这个值按比例变化以提供更大的窗口。
TCP头部最多60字节(20字节为固定部分)
URG:表示紧急指针是否有效
ACK:表示确认号是否有效
PSH:提示接收端应用程序应该立即从TCP接受缓冲区读走数据,为后续数据腾出空间。
RST:表示要求对方重新建立连接
SYN:表示请求建立一个连接
FIN:表示通知对方本端要关闭
头部选项信息:
这里写图片描述
流量控制
针对的是发送方和接收方速度不匹配的问题(比如经典的fast sender and slow receiver问题,接收方缓存大小与发送速率不匹配),提供一种速度匹配服务遏制发送速率使接收方应用程序的读取速率与之相适应。
超时重传
其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。
3、IP协议
IP提供不可靠、无连接的数据服务。不可靠的是指它不能保证IP数据报能成功地到达目的地;无连接是指IP并不维护任何关于后续数据报的状态信息,每个数据报的处理是相互独立的。
普通的IP首部长为20字节,除非含有选项字段
这里写图片描述
总长度字段是指整个IP数据报的长度,该字段长16位,IP数据报的最大长度为65535(范围在[0,2^16])字节。
MTU
以太网对数据帧的长度有一个限制,最大值是1500。链路层的这个特性称作MTU(最大传输单元)。如果IP层数据报的长度比链路层的MTU还要大,那么IP层就需要进行分片,每一片都要小于MTU。
IP分片
IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。把一份IP数据报分片以后,只有到达目的地才进行重新组装。重新组装由目的端的IP层来完成,其目的是使分片和重新组装过程对传输层透明。

4、TCP的三次握手和四次挥手
这里写图片描述
(1)、TCP为什么是3次握手不是2次呢?
在谢希仁版《计算机网络》中是这样说的,当第一次握手的时候,client发出的SYN报文没有丢,但是在网络节点中滞留了很长时间,可能一直到连接释放时才到达ser端,本来这是一个已经失效的报文段,但是ser误认为是一个新的连接请求报文,就会发送ACK报文同意连接。如果只有2次握手,那这种情况下,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。TCP是一种可靠传输协议,它的核心思想就是在可靠传输的基础上保证传输效率,所以3次刚刚好。
(2)、为什么是四次挥手
先把关闭流程走一遍:)
第一次挥手:client发送FIN报文给server端,此时client状态变成FIN_WAIT_1,意思是自己已经没有要发送的数据了。
第二次挥手:server收到报文后变成CLOSE_WAIT,并回复ACK报文,表明已经知道client没有要发送的数据了,但还是可以向client发送数据。
第三次挥手:server向client发送FIN,状态变成LAST_ACK,请求关闭连接,此时client状态变成TIME_WAIT
第四次挥手:client收到server发送的FIN报文段,向其发送ACK报文段,然后进入TIME_WAIT状态;server收到client的ACK报文段以后,就关闭连接;此时,client等待2MSL后依然没有收到回复,则证明server端已正常关闭,那client也可以关闭连接了。
TCP是全双工通信,通信的双方都能进行读写操作,所以关闭时双方都应该关闭,才能保证它的可靠。

原创粉丝点击