基础:TCP三次握手做了什么,为什么要握手?

1. TCP 三次握手在做些什么

1. 第一次握手

1)握手作用:客户端发出建立连接请求。

2)数据处理:客户端发送连接请求报文段,将SYN 位置为1,Sequence Numberx ;然后,客户端进入SYN_SEND状态,等待服务器的确认。

2. 第二次握手

1)握手作用:服务端收到客户端请求后,回复报文给客户端,表示客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接。

2)数据处理:服务器收到客户端的SYN 报文段,需要对这个SYN 报文段进行确认,设置Acknowledgment Numberx+1(Sequence Number+1) ;同时,自己自己还要发送SYN 请求信息,将SYN 位置为 1Sequence Number 为 y;服务器端将上述所有信息放到一个报文段(即SYN+ACK 报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态。

3. 第三次握手

1)握手作用:客户端收到服务端的确认报文信息后,发送报文给服务端,表示确认收到服务器端同意连接的信号。

2)数据处理:客户端收到服务器的SYN+ACK 报文段。然后将Acknowledgment Number 设置为y+1 ,向服务器发送ACK 报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED 状态,完成TCP三次握手。

4. 讨论:accept函数调用时,三次握手是否已经完成?

先来看个图:

  • 服务端首先会调用 listen 函数监听客户端的连接请求。

  • 然后服务端调用 accept 函数阻塞等待取出未决连接队列中的客户端连接。

  • 如果服务端未决连接队列一直为空,这意味着没有客户端和服务器建立连接,那么 accept 就会一直阻塞。

  • 当客户端调用 connect 函数发起连接时,如果完成tcp三次握手,那么 accept 函数会取出一个客户端连接(注意:是已经建立好的连接)然后立即返回。

注意:
accept 函数调用成功,返回的是一个已经完成 tcp 三次握手的客户端连接。如果在三次握手的过程中(最后一步),服务端没有收到客户端的ACK ,说明三次握手还没有建立完成,accept 函数依然会阻塞。

2. 为什么要三次握手

谢希仁老师在《计算机网络》中有讲到:

"三次握手的目的是:为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误"。

书中还举了个"已失效的连接请求报文段 "例子,为了方便阅读,这里对原文做了分段,具体原文描述如下:

"client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。

本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。

假设不采用 "三次握手",那么只要 server 发出确认,新的连接就建立了。

由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据(因为client现在是CLOSED状态)。

但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。

这样,server 的很多资源就白白浪费掉了。

采用 "三次握手" 的办法可以防止上述现象发生。

例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接"。

从另外一个角度来讲,三次握手是为了防止服务端一直等待从而浪费资源。

相关推荐
lkbhua莱克瓦2418 小时前
Java基础——常用算法3
java·数据结构·笔记·算法·github·排序算法·学习方法
吃饺子不吃馅20 小时前
前端画布类型编辑器项目,历史记录技术方案调研
前端·架构·github
省四收割者20 小时前
GitHub Action工作流语法
笔记·github
小李独爱秋20 小时前
计算机网络经典问题透视:什么是NAPT?它有哪些特点?
网络·网络协议·计算机网络·网络安全·智能路由器
QT 小鲜肉21 小时前
【Git、GitHub、Gitee】按功能分类汇总Git常用命令详解(超详细)
c语言·网络·c++·git·qt·gitee·github
wukan8881 天前
【SMTP】在线配置测试工具,如何配置接口?
git·网络协议·编辑器
散峰而望1 天前
基本魔法语言函数(一)(C语言)
c语言·开发语言·编辑器·github
oil欧哟1 天前
GitHub星标3万,OpenAI 官方支持——深度解读 AI Agent 连接协议的行业标准 MCP
人工智能·github
粟悟饭&龟波功1 天前
【GitHub热门项目】(2025-11-07)
github