linux TCP 三次握手

TCP三次握手:

  TCP 是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的”连接“,其实是 客户端 和 服务器的内存里保存的一份关于对方的信息,如 IP地址,端口号等

  TCP 可以看成是一种字节流,它会处理 IP 层或以下的层的 丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在 TCP 的头部。

  TCP 提供了一种可靠、面向连接、字节流、传输层的服务,采用 三次握手 建立一个连接。采用 四次挥手来关闭一个连接。(三次握手和四次挥手是协议的行为)

  三次握手的目的是保证双方互相之间建立了连接。

  三次握手发生在客户端连接的时候,当调用 connect(),底层会通过TCP协议进行三次握手。

     

  🔴 16位端口号(prot number):告知主机报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。进行 TCP 通信时,客户端通常使用系统自动选择的临时端口号。

  🔴 32位序号(sequence number):一次 TCP 通信(从 TCP 连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值 ISN(Initial Sequence Number,初始序号值)。那么在该传输方向上(从A到B),后续的TCP报文段中序号值被系统设置成 ISN 加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如,某个 TCP 报文段传送的数据是字节流中的第 1025 ~ 2048 字节,那么该报文段的序号值就是 ISN + 1025。另外一个传输方向(从B到A)的TCP报文段的序号值也具有相同的含义。

  🔴 32位确认号(acknowledgement number):用作对另一方发送来的 TCP 报文段的响应。其值是收到的 TCP报文段的序号值 + 标志位长度(SYN,FIN)+ 数据长度。假设主机A 和 主机B 进行 TCP通信,那么A 发送出的 TCP报文段不仅携带自己的序号,而且包含对 B发送来的 TCP 报文段的确认号。反之, B发送出的TCP 报文段也同样携带自己的序号和对A发送来的报文段的确认序号。

  🔴 4位头部长度(head length):标志该 TCP 头部有多少个 32bit(4字节)。因为4位最大能表示15,所以TCP头部最长是60字节。

  🔴 6位标志位包含如下几项:

    ⚪ URG标志,表示紧急指针(urgent pointer)是否有效。

    ⚪ ACK标志,表示确认号是否有效。我们称携带 ACK 标志的 TCP报文段为确认报文段。

    ⚪ PSH标志,提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间(如果应用程序不将接收到的数据读走,它们就会一直停留在TCP接收缓冲区中)。

    ⚪ RST标志,表示要求对方重新建立连接。我们称携带 RST 标志的 TCP 报文段为复位报文段。

    ⚪ SYN标志,表示请求建立一个连接。我们称携带 SYN标志的 TCP报文段为同步报文段。

    ⚪ FIN标志,表示通知对方本端要关闭连接了。我们称携带 FIN 标志的 TCP报文段为结束报文段。

  🔴 16位窗口大小(window size):是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口(Receiver Window,RWND)。它告诉对方本端的 TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。

  🔴 16位校验和(TCP checksum):由发送端填充,接收端对TCP报文段执行 CRC算法以校验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包含 TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。

  🔴 16位紧急指针(urgent pointer):是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一个字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧数据的方法。

三次握手配图:

    

确认序号配图:

        

  第一次握手:

    1. 客户端请求服务器连接 :SYN = 1

    2. 生成一个随机的 32 位序号 J ,这个序号后边是可以携带数据(数据的大小):seq = J

  第二次握手:

    1.服务器端接收客户端的连接:ACK = 1

    2.服务器会回发一个确认序号: ack = 客户端的序号 + 数据长度 + SYN/FIN(按一个字节算)   acjk = J + 1 + 数据长度

    3. 服务器会向客户端发起连接请求: SYN = 1

    4.服务器会生成一个随机序号: seq = K

  第三次握手:

    1. 客户端应答服务器的连接请求:ACK = 1

    2. 客户端回复收到了服务器端的数据: ack = 服务端的序号 + 数据长度 + SYN/FIN(按一次字节算)

posted on   廿陆  阅读(23)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2021-10-12 VS Code初下载--解决官网下载慢的问题
点击右上角即可分享
微信分享提示