TCP的连接和断开
2017-03-22 22:31
113 查看
翻到之前的笔记,顺便整理一下。不合适的地方望各位不吝赐教!参考:http://www.cnblogs.com/Jessy/p/3535612.html
http://blog.chinaunix.net/uid-26495963-id-3284813.html
http://blog.csdn.net/a19881029/article/details/29557837
先介绍下TCP报文的格式,方便后续的理解,如下图
源端口号和目表端口号结合IP数据报中的源IP与目的IP唯一标识一条TCP连接。
顺序号:为首字节在整个数据流中的位置,表示数据流中的字节数,并在连接建立阶段予以同步。
确认号:表示序号为确认号减去1的数据包及其以前的所有数据包已经正确接收,也就是说他相当于下一个准备接收的字节的序号。
头部长度:用于指示数据起始位置。由于TCP包头中可选项的长度可变,因此整个包头的长度不固定。如果没有附加字段,则TCP数据包基本长度为20字节。注:4位所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。
保留位:闲下来的地方,作为后续扩展。
标志位,设置为1时有效
URG(urgent):决定紧急指针是否有效。
ACK(acknowledgement):决定确认号是否有效。
PSH(push):决定是否立即发送数据给对方,不会等缓冲区满后再发。
RST(reset):一般在出错或关闭连接时使用。
SYN(synchronous):在建立连接时使用,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,在发回的报文段中使SYN=1和ACK=1。
FIN(finish):表示发送方完成了数据发送。
窗口:表示本次交互可接收的字节数,用于流量控制。窗口大小根据网络拥塞情况和资源可用性进行增减(连接建立时,各端会分配一块缓冲区用来存储接收的数据,剩余缓冲区空间的大小叫做窗口)。
校验和:用于检查TCP数据包头和数据的一致性。
紧急指针:当URG标志位有效时,指向紧急数据的位置,该位置的数据将被优先处理。
可选项:最常用的选项是最大段大小(Maximum Segment Size,MSS),向对方通知本机可以接收的最大TCP段长度。MSS选项只在建立连接的请求中发送。
TCP三次握手
TCP四次挥手
为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
一、保证TCP协议的全双工连接能够可靠关闭
如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
二、保证这次连接的重复数据段从网络中消失
再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。
简言之,TIME_WAIT状态就是用来重发可能丢失的ACK报文。
http://blog.chinaunix.net/uid-26495963-id-3284813.html
http://blog.csdn.net/a19881029/article/details/29557837
先介绍下TCP报文的格式,方便后续的理解,如下图
源端口号和目表端口号结合IP数据报中的源IP与目的IP唯一标识一条TCP连接。
顺序号:为首字节在整个数据流中的位置,表示数据流中的字节数,并在连接建立阶段予以同步。
确认号:表示序号为确认号减去1的数据包及其以前的所有数据包已经正确接收,也就是说他相当于下一个准备接收的字节的序号。
头部长度:用于指示数据起始位置。由于TCP包头中可选项的长度可变,因此整个包头的长度不固定。如果没有附加字段,则TCP数据包基本长度为20字节。注:4位所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。
保留位:闲下来的地方,作为后续扩展。
标志位,设置为1时有效
URG(urgent):决定紧急指针是否有效。
ACK(acknowledgement):决定确认号是否有效。
PSH(push):决定是否立即发送数据给对方,不会等缓冲区满后再发。
RST(reset):一般在出错或关闭连接时使用。
SYN(synchronous):在建立连接时使用,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,在发回的报文段中使SYN=1和ACK=1。
FIN(finish):表示发送方完成了数据发送。
窗口:表示本次交互可接收的字节数,用于流量控制。窗口大小根据网络拥塞情况和资源可用性进行增减(连接建立时,各端会分配一块缓冲区用来存储接收的数据,剩余缓冲区空间的大小叫做窗口)。
校验和:用于检查TCP数据包头和数据的一致性。
紧急指针:当URG标志位有效时,指向紧急数据的位置,该位置的数据将被优先处理。
可选项:最常用的选项是最大段大小(Maximum Segment Size,MSS),向对方通知本机可以接收的最大TCP段长度。MSS选项只在建立连接的请求中发送。
TCP三次握手
TCP四次挥手
为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
一、保证TCP协议的全双工连接能够可靠关闭
如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
二、保证这次连接的重复数据段从网络中消失
再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。
简言之,TIME_WAIT状态就是用来重发可能丢失的ACK报文。
相关文章推荐
- Netty4 Tcp长连接、断开重连、心跳监测、Msgpack编码解码
- TCP连接与断开详解(socket通信)
- 检查非正常断开的tcp连接
- TCP连接和断开过程详解
- Wireshark分析TCP连接断开过程分析与总结
- Tcp 断开连接
- TCP连接和断开 “三次握手和四次挥手”
- TCP断开连接时的2MSL的time_wait状态
- TCP协议及TCP正常连接与断开
- 一点细节 关于linux下tcp断开连接时的情况
- TCP/IP 断开连接
- tcp连接与断开连接
- QT tcpsocket 在断开后重新连接程序直接崩溃
- TCP协议三次握手连接四次握手断开和DOS攻击
- TCP建立连接和断开连接过程
- TCP协议连接建立与连接断开过程(含断开时的TCP状态图)
- TCP连接建立断开
- 怎样及时检测出非正常断开的TCP连接
- 【网络编程】TCP连接与断开的API图示讲解
- TCP断开连接过程(四次挥手)