祥解TCP协议(二)——连接管理(三次握手及四次挥手)

一、理解连接管理基础

回顾下与连接管理相关TCP首部组成,重要指数五星

1.1序号(***)

TCP首部的***就是应用数据第一个字节的编号
应用进程的数据在TCP分割一个个报文段,报文段中数据被看成一个个字节流,所以***就是要发送数据的开始

1.2确认序号(确认号)

接收方期望收到发送方要发送的***,即该序号的字节还没有到达
从另外的角度说明,之前的***已经到达,所以TCP采用累计确认机制

1.3ACK

表示确认序号是否有效,值等于1表示确认序号有效,等于0无效

1.4SYN

对于这个概念我纠结了半天,最后搞明白了
SYN就是建立连接的信号,用大白话叙述下

发送方SYN=1时,意思就是,我要和你建立连接了啊
接收方SYN=1时,意思就是,好啊来吧

是不是通俗易懂????

理解了上边的几个概念,三次握手就理解了大半部分

二、三次握手

2.1三次握手握的是什么?

当然了,不是手。
握的是双方的初始化***,也就是,发送方数据从那个***开始发,接收方从那个***开始发,不一定就是从1开始,这个***是随机的。

2.2三次握手过程

祥解TCP协议(二)——连接管理(三次握手及四次挥手)
第一次握手(称发送报文段为SYN段)

  • ***=m:告诉服务器我要开始从***m发数据
  • SYN=1:建立连接的信号(相当于:我要和你连接了啊)

第二次握手(称发送报文段为SYNACK段)

  • ***n:告诉客户端,我要开始从***n发数据
  • 确认号m+1:告诉客户端,已收到***m的数据,希望发m+1的
  • SYN=1:确认客户端连接(相当于:ok可以)
  • ACK=1:表示确认号m+1是有效的

第三次握手(称发送报文段为ACK段)

  • ***=m+1:发给服务器序号m+1的数据
  • 确认号=n+1:告诉服务器已接收***n数据,希望发n+1的
  • ACK=1:此确认号有效
    还有一个隐含条件:SYN=0,表示不需要重新建立连接。

至此三次握手就搞定了,再来思考一个问题

2.3为什么必须要三次握手

  • 确保连接双方知道双方的情况(初始化***等)
  • 避免无效连接的建立

下面说下,为什么二次握手不可以

1.假如第二次握手报文控制段丢失,而客户端认为建立了连接,服务器端没有建立连接,则此时为无效连接。

2.无法避免无效连接的连接。当使用无效连接传输数据时,客户端无法得到服务器端确认,会重传数据,此时认为创建了一个新连接(半连接),服务器为此类连接分配资源,半连接多的时候,服务器便拒绝服务

3.假如没有第三次握手,服务器不知道客户端是否知道自己要发的数据***,如果此时发送,可能出现数据错误

三、四次挥手

等数据传输完了就需要关闭连接了,这个是由四次挥手实现

3.1理解四次挥手基础

再介绍一个TCP首部的组成部分

FIN:释放连接,值为1发送方后面没有数据要发送了

3.2为什么连接三次握手,关闭四次挥手

上一篇博客提到,TCP采用全双工通信,客户端与服务器都有一个发送方与接收方,因此需要四次才能关闭

具体看下面

3.3四次挥手过程

英文版如下
祥解TCP协议(二)——连接管理(三次握手及四次挥手)
汉语版的如下:

祥解TCP协议(二)——连接管理(三次握手及四次挥手)
和之前类似的字段就不再叙述了,两张图对比看下就可以对应上

第一次挥手

  • FIN=1:客户端已经没有数据发送

第二次挥手

  • 服务器确认收到客户端发来最后的数据

第三次挥手

  • FIN=1:服务器后面没有数据要发送

第四次挥手

  • 客户端确认收到服务器最后的数据

至此连接关闭

感谢阅读,欢迎交流