当前位置: 首页 > article >正文

基础: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 并没有要求建立连接”。

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


http://www.kler.cn/a/273423.html

相关文章:

  • 十四届蓝桥杯STEMA考试Python真题试卷第二套第五题
  • QEMU学习之路(4)— Xilinx开源项目systemctlm-cosim-demo安装与使用
  • Jmeter——结合Allure展示测试报告
  • Python代码解析:生成Jieba自定义词典
  • 嵌入式——了解stm32
  • 【设计模式系列】总览
  • 【DataWhale学习笔记-蝴蝶书共读】大语言模型背后
  • CTF题型 Http请求走私总结Burp靶场例题
  • EI Scopus检索 | 第二届大数据、物联网与云计算国际会议(ICBICC 2024) |
  • 苍穹外卖-day09:用户端历史订单模块(理解业务逻辑),商家端订单管理模块(理解业务逻辑),校验收货地址是否超出配送范围(相关API)
  • springboot280基于WEB的旅游推荐系统设计与实现
  • 环境变量和Bash内置命令
  • android 顺滑滑动嵌套布局
  • Mac玩《幻兽帕鲁》为什么打不开D3DMetal?d3d错误怎么办 d3dxl error
  • 基于YOLOv8深度学习的橙子病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分类
  • mac清除dns缓存指令 mac清除缓存怎么清理
  • 复制word文档,合并word文档
  • 【vscode】vscode重命名变量后多了很多空白行
  • 计算地球圆盘负荷产生的位移
  • Ubuntu 搭建gitlab服务器,及使用repo管理
  • 利用textarea和white-space实现最简单的文章编辑器 支持缩进和换行
  • vue使用element-ui 实现自定义分页
  • TT-100K数据集,YOLO格式
  • MR混合现实情景实训教学系统在汽车检修课堂中的应用
  • 汽车电子零部件(8):T_Box
  • vsto excel 插件注册表属性值含义