您的位置:首页 > 理论基础 > 计算机网络

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报文。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TCP