随着经历增多,现在对于TCP协议有了比较形象的认识,在学习游双大佬的书时遇到了对方先断开的情形,引发了我对于tcp不同断开场景的求知欲。
备用知识点
标识位说明
URG:为1时,表示紧急指针有效
ACK:确认标识,连接建立成功后,总为1。为1时确认号有效
PSH:接收方应尽快把这个报文交给应用层
RST:复位标识,重建连接
SYN:建立新连接时,该位为0
FIN:关闭连接标识
初始化序列号ISN(Initial Sequence Number)
序列号是保证TCP通信可靠性的关键基础,TCP通过序列号来判断报文是否丢失、是否需要重传。
每一个新建立的TCP连接都会分配一个初始序列号ISN,为了防止因为延迟、重传等扰乱三次握手,为了TCP协议栈的稳定性,ISN不能随便选取。一般推荐的ISN生成基本规则:
1)递增,直到超过最大值,再从较小的值开始。ISN如果不是递增的,就可能因为网络延迟导致ISN重复,引起后续通信错乱,连接失败。
2)随机,ISN必须是不可预测的随机数,如果ISN可以预测,将会引起很多安全问题。
教科书场景
实验场景:C发起连接,连接成功后C断开连接
建立连接的过程:
第1个报文段
C ->S 同步报文段(SYN),也就是发起连接请求,同时带上自己的ISN值为4273807524
的序号
第2个报文段
S->C 同步报文段(SYN),同时它发送自己的ISN值为4940891641
的序号,并对第1个同步报文段进行确认。确认值是4273807525
,即第1个同步报文段的序号值加1。(序号值是标识TCP数据流中的每一字节的。但同步报文段比较特殊,即使它没有携带任何应用程序数据,它也要占用一个序号值。
第3个报文段
C->S是对第2个同步报文段的确认。至此TCP连接就建立起来了。
关闭连接的过程:
第4个报文段
C->S这个报文段包含FIN标志,因此它是一个结束报文段,即C要求关闭连接。结束报文段和同步报文段一样,也要占用一个序号值。
第5个报文段
S用tcp报文段5来确认结束报文段4
第6个报文段
紧接着S发送自己的结束报文段6
第7个报文段
C则用报文段7给予确认
实际上,仅用于确认目的的确认报文段5是可以省略的,因为结束报文段6也携带了该确认信息。确认报文段5是否出现在断开连接的过程中,取决于TCP的延迟确认特性。