TCP的连接和断开

翻到之前的笔记,顺便整理一下。不合适的地方望各位不吝赐教!参考: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报文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值