• TCP的三次握手和四次挥手


    目录

    1️⃣TCP协议格式

    2️⃣TCP三次握手

    3️⃣TCP四次挥手


     

    1️⃣TCP协议格式

    9d9ebc2322fd42e3b2309c1604cd4b2a.png

     

    TCP报头当中各个字段的含义如下:

    • 源/目的端口号:表示数据是从哪个进程来,到发送到对端主机上的哪个进程。
    • 32位序号/32位确认序号:分别代表TCP报文当中每个字节数据的编号以及对对方的确认,是TCP保证可靠性的重要字段。
    • 4位TCP报头长度:表示该TCP报头的长度,以4字节为单位。
    • 6位保留字段:TCP报头中暂时未使用的6个比特位。
    • 16位窗口大小:保证TCP可靠性机制和效率提升机制的重要字段。
    • 16位检验和:由发送端填充,采用CRC校验。接收端校验不通过,则认为接收到的数据有问题。(检验和包含TCP首部+TCP数据部分)
    • 16位紧急指针:标识紧急数据在报文中的偏移量,需要配合标志字段当中的URG字段统一使用。
    • 选项字段:TCP报头当中允许携带额外的选项字段,最多40字节。

    TCP报头当中的6位标志位:

    • URG:紧急指针是否有效。
    • ACK:确认序号是否有效。
    • PSH:提示接收端应用程序立刻将TCP接收缓冲区当中的数据读走。
    • RST:表示要求对方重新建立连接。我们把携带RST标识的报文称为复位报文段。
    • SYN:表示请求与对方建立连接。我们把携带SYN标识的报文称为同步报文段。
    • FIN:通知对方,本端要关闭了。我们把携带FIN标识的报文称为结束报文段。

    2️⃣TCP三次握手

    677f29e3ed4c4f79ac1fa392afc402fa.png

    • 第一次握手:建立连接。客户端发送连接请求报文,将SYN置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认。
    • 第二次握手:服务器收到SYN报文段。需要对这个SYN报文段进行确认,设置ACK为x+1;同时发送SYN请求信息,将SYN置为1,Sequence Number为y ;发送SYN+ACK报文段给客户端,此时服务器进入SYN_RECV状态。
    • 第三次握手:客户端收到服务器发送的SYN+ACK报文段。然后将ACK设为Y+1,向服务器发送ACK报文段确认应答。客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手。

    为什么一定进行三次握手? 

            三次握手完成两个重要功能:双方做好发送数据的准备工作;双方就初始序列号进行协商。

    如果现在把三次握手改为两次握手,可能发送死锁!!

            假定一个客户端给服务端发送一个SYN请求连接,服务端收到SYN请求,发送确认应答ACK,此时已经完成了两次握手。但服务端发送了确认应答,客户端却可能未收到,此时客户端不知道服务端是否做好了准备,不知道服务端建立什么样的序列号,甚至怀疑服务端是否收到自己的连接请求。在这种情况下,客户端认为连接还未建立成功,将忽略服务端发来的任何数据分组,只等待连接确认应答分组。而服务端发出的分组超时后,重复发送同样的分组,这样就形成死锁。 

    3️⃣TCP四次挥手

    当数据传送完毕后,就需要断开TCP连接,此时就产生了TCP的四次挥手,以下采取客户端发起断开连接请求讲解。

    62c8efdb45db4756a7473821dd32064f.png

    • 第一次挥手:客户端设置Seq和Ack,向服务端发送一个FIN报文段;此时,客户端进入FIN_WAIT_1状态;这表示客户端没有数据要发送给服务端了。
    • 第二次挥手:服务端收到客户端发送的FIN报文段,向客户端发送确认应答ACK报文段,ACK为Seq+1,客户端进入FIN_WAIT_2状态;服务端告诉客户端,我同意你的关闭请求。
    • 第三次挥手:服务端向客户端发送FIN报文段,请求关闭连接,服务端进入LAST_ACK状态。
    • 第四次挥手:客户端收到服务端发送的FIN报文段,向服务端发送ACK确认应答报文段,客户端进入TIME_WAIT状态;此时客户端等待2MSL后依然没有收到回复,则证明服务端已正常关闭,那么客户端也可以关闭连接了。

    为什么TIME_WAIT状态下要等待2MSL?

    MSL:数据包在网络中的最大生存时间。 2MSL是最大报文段生存时间。

            TIME_WAIT状态是为了等待连接上所有的分组的消失。假如单纯认为发送端只需要等待一个MSL的话,此时发送端发送ACK报文段后就关闭,如果ACK报文段丢失,接受端处在LAST_WAIT状态下,未接收到 ACK报文段,此时就无法正常进入关闭连接状态。

            而等待2MSL,接受端未接收到ACK报文段,则超时重传FIN请求报文段,发送端发送ACK应答报文段,重新启动时间等待计时器,最后都能正常的关闭。

     

     

  • 相关阅读:
    分发饼干(贪心算法+图解)
    Gartner发布中国科技报告:数据编织和大模型技术崭露头角
    Ubuntu-Ports更新源 ARM64更新源
    ASH是否可以生成备库的ASH
    系统性能评价概述
    河北海格里斯HEGERLS箱式四向穿梭车物流解决方案|5G人工智能机器人自动化立体库
    【软件测试】面试老约不到?软件测试简历项目经验怎么写?论项目经验的重要性......
    1、项目准备与新建
    Go 文件操作
    第58篇-京东滑块流程分析【2023-09-26】
  • 原文地址:https://blog.csdn.net/bang___bang_/article/details/132692250