博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP 三次握手和四次挥手及其状态
阅读量:2493 次
发布时间:2019-05-11

本文共 1525 字,大约阅读时间需要 5 分钟。

三次握手:
     TCP的三次握手过程:
  1.     C端发送SYN(SYN=1)标志,同时发送一个SEQ number(SEQ为一个随机数),表示要和S端进行连接。(C: SYN_SENT S: LISTEN )
  2.     S端接收到这个含有(SYN=1)的包之后,表示要接受这个包,则回复一个ACK number(ACK=SEQ+1 ),然后也回复一个SYN=1,ACK=1的包。( C:SYN_SENT, S:SYN_REVD)
  3.     C端回复一个ACK number包(ACK=SEQ+1), ACK = 1,然后连接就建立了,剩下的工作就是去传输了。(C: ESTABLISHED S:ESTABLISHED)
疑问:
     这个地方之前自己存在一个误区,误以为SYN 和 SYN number是一个东西,结果导致两者混淆,一直没有真正理解这个三次握手,造成错误一直持续到现在,悔之晚矣。多加几个疑问,
就会不再想当然了。
图中,可以看到第一条,首先10.0.0.61 向10.1.3.32 发送了一个SYN包,及SYN的标志位为1,并且发送了一个Seq number=2856901853,
第二条:10.1.3.32接收到请求后,返回了一个SYN+ACK包,及确认以及连接包,Ack number=2856901853+1,然后随机发了一个Seq=3836060639的随机数。
第三条:10.0.0.61 接收到请求后,返回了一个ACK包,ACK number=3836060639+1 ,然后发了一个Seq=随机数。
通过以上三条,则建立了一个有状态的连接,随后进行的是一个数据传输的过程。
三次握手的本质是,双方可靠的交换了一个Seq号,通过该Seq号,确认了后续传输的有序性。
四次挥手:
     四次挥手的过程,首先一个很重要的提醒是百度百科中的一句话,及TCP是全双工的,所以需要来去双方都来关闭连接。
     假设A已经传完了所有的数据
  1.     A发送一个FIN标志位为1的包,表明自己已经完成了传输。
  2.     B发送一个ACK表示自己已经知道了,并且关闭了来自于A->B的连接。
  3.     过了一会儿,B也传完了所有的数据,接着B发送了一个FIN标志为1的包,然后就传给了A。
  4.     A一看来了个FIN的标志,从而说明已经收到了B的断开连接的信号,然后A发了一个ACK=1的包,正式断开了所有连接。
仔细一看这段描述,发现有几个问题,首先A发了一个FIN=1的包,只是说明A已经将该传的都传完了,至于B收到与否,A到底管不管,或者知道不知道。
所以,显然,事情不应该如上面所说,如同三次握手一样,必须存在着Seq number的介入。
正确过程如下:
  1.     A发送一个FIN=1的包,并且有个Seq number。(A:FIN_WAIT_1 B:ESTABLISHED)
  2.     B收到后,返回一个ACK=1的包,并且返回一个Ack number= Seq number+1的包。(A: FIN_WAIT_1 B:CLOSE_WAIT)
  3.     B传输完毕后,和另外一个连接一样,发一个FIN=1的包,并同时携带一个Seq number。(A:FIN_WAIT_2 B:LAST_ACK)
  4.     A收到后,返回一个ACK=1的包,并同时把Ack number = seq number +1的包发给A。(A:TIME_WAIT B:CLOSED)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29757574/viewspace-2135346/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29757574/viewspace-2135346/

你可能感兴趣的文章
Docker面试题(二)
查看>>
一、redis面试题及答案
查看>>
消息队列2
查看>>
C++ 线程同步之临界区CRITICAL_SECTION
查看>>
测试—自定义消息处理
查看>>
MFC中关于虚函数的一些问题
查看>>
根据图层名获取图层和图层序号
查看>>
规范性附录 属性值代码
查看>>
提取面狭长角
查看>>
Arcsde表空间自动增长
查看>>
Arcsde报ora-29861: 域索引标记为loading/failed/unusable错误
查看>>
记一次断电恢复ORA-01033错误
查看>>
C#修改JPG图片EXIF信息中的GPS信息
查看>>
从零开始的Docker ELK+Filebeat 6.4.0日志管理
查看>>
How it works(1) winston3源码阅读(A)
查看>>
How it works(2) autocannon源码阅读(A)
查看>>
How it works(3) Tilestrata源码阅读(A)
查看>>
How it works(12) Tileserver-GL源码阅读(A) 服务的初始化
查看>>
uni-app 全局变量的几种实现方式
查看>>
echarts 为例讲解 uni-app 如何引用 npm 第三方库
查看>>