图片详解TCP连接的三次握手,四次断开基本原理

2023-11-20

图片详解TCP连接的三次握手,四次断开

作者:林子
时间:2014年8月
出处:http://blog.csdn.net/u013011841/article/details/38519971
声明:欢迎指出错误

           TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接传输协议,就像打电话一样一直占着线在聊天,而不是像邮件一样你一封我一封的通信。了解三次握手,四次断开之前有必要先学习一些基本概念,首先,最重要的是TCP的首部 ,  TCP的数据被装在一个IP数据包里面,如图,可以知道的是一个IP包里面有一个TCP报文段,一个TCP报文段里面有一个TCP首部


IP数据包结构


知道TCP首部有什么用?

            TCP首部对于理解三次握手四次断开有比较关键的作用,如果不知道这些基础的概念,看到后面你就会晕头转向的。其中两个最重要的字段是 序列号字段确认号字段。   

另外比较重要的是   SYN(synchronous)同步比特,ACK(Acknowledgement)确认比特位FIN(finished)结束位

   SYN和ACK比特位用来帮助建立TCP连接.

    FIN和ACK比特位用来帮助释放TCP连接. 

            稍微计算一下,8位一个字节,端口号占用4个字节。所以总共5行,占用20字节的空间。最下面两行为TCP数据,在建立连接和释放的阶段属于可选项。

为什么要使用32位的序列号ISN呢?

        序列号(ISN)是用来标记从TCP发送端到TCP接受端发送的字节流,请注意是字节流,一般序列号随着时间流递增。

         比如发送数据阶段一段数据由500 000字节文件组成,一个TCP报文段装载1000字节,则有500个TCP报文段,那么第一个报文段的序列号为1,第二个报文段的序列号为1001,第三个报文段的序列号为2001

         但是在建立连接和释放连接阶段的时候序列号一般只加一。

       为什么使用ISN呢?这是因为在互联网上传数据经常会出现丢包的情况以及包延迟的情况。如果没有序列号,由于到达顺序不同,主机将不知道如何管理这些包。

         例如序列号为0和2000的包已经送到主机,这时序列号为1000的包刚到,如果不知道这些序号,主机则不知道怎么排序这些数据。


确认号其包含了发送端所期望收到的下一个序列号(即收到的序列号+1)。

         确认号存在的意义就是说我收到你发过来的包啦,赶紧把下一个序列号也发给我吧。


三次握手

为什么会叫三次握手呢?

首先主机A发送一个包给主机B,主机B发回一个确认为第一次握手

主机B发送一个包回主机A,主机A发回一个确认为第二次握手

主机A再发送最后一个确认给主机B,主机B收到确认建立连接第三次握手.

1、 主机A先发送一个32位初始序列号SEQ=x给主机B ,

设置SYN=1表示要建立TCP连接.

2、 主机B收到信息后,如果同意连接,发送一个32位确认号ACK=x+1,然后为自己选择一个32位初始序列号SEQ=y给主机A,

设置SYN=1表示建立TCP连接,再设置ACK=1位表示确认收到连接申请

3、 主机A收到收到主机B的确认后,向B发送序列号SEQ=x+1,确认号ACK=y+1

设置ACK=1位表示确认 

 

 最后将进行全双工的通信,全双工就是指可以同一时刻你发信息给我,我也可以发信息给你,不耽误。

这里有一个很重要的问题是:为什么A还要发送一次确认呢?

         先假设主机A不用发送确认,那么当互联网中出现丢包现象,主机A发送的连接请求经过很长时间才到达主机B,这个时候主机A已经和主机B由于超时重新连接已经通信过了。但是仍然收到一个连接请求。主机A由于已通信过了,所以不理睬B的确认信号,这个时候主机B将建立连接并长时间白白浪费端口和资源。主机B如果是服务器的话,那么其他客户端根本就没有可以连接的机会了,这是一种灾难。


四次断开

             这里我们得先知道TCP连接的一种状态,即半关闭状态,指的是A已经没有数据发给B了,但是B还有数据要发送给A。

  所以关闭过程分为两步,先关闭A到B的连接,再关闭B到A的连接。

什么叫四次握手?




这样可能很不严谨,但是为了方便理解

第一次、主机A发送结束请求,停止发送数据,主机B确认

发送FIN=1, 表示A已关闭,请B做好准备

第二次、主机B发送确认信息准备关闭,主机A确认,这时B仍然可以向A发送数据.

发送ACK=1表示B收到了请求

第三次、主机B再发送关闭,主机A再次确认

发送FIN=1,表示我准备关闭了,只要你发送确认我就关闭

第四次、主机A发送确认,主机B关闭连接

发送ACK=1,B关闭连接


更多资料

1、计算机自顶向下

2、计算机网络(谢希仁)

3、TCP/IP详解 卷1

4、图解TCP/IP

5、Computer networks



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图片详解TCP连接的三次握手,四次断开基本原理 的相关文章

  • Indy TCP - 循环读取数据

    TCP 服务器每 8 毫秒连续发送一次数据帧 我想编写一个能够接收这些数据帧的客户端 Indy 9 中是否有任何程序可以知道缓冲区中是否有可用数据 我当前的程序如下 我正在使用线程 procedure TThreadRead Execute
  • TCP 数据偶尔会以错误的顺序接收且不完整

    我用 Java 创建了 TCP 服务器应用程序 并用 C 创建了客户端应用程序 当我发送数据时 客户端有时会乱序接收数据 有时部分会完全丢失 基本上 我在服务器 java 中使用的代码如下 已删除 ServerSocket welcomeS
  • TCP recvfrom() 不存储“from”

    我正在使用 TCP 制作一个服务器程序 我想获取我刚刚收到的消息发送者的 IP 地址 这是我的代码 case FD READ Incoming data get ready to receive char buffer DEFAULT BU
  • WCF TCP 客户端 - 如何使用它们的基本指南?

    我有一个 WCF 服务并希望使用 TCP 绑定连接到它 这一切都很好 但是你应该如何处理客户呢 我注意到 如果您为每个调用创建一个新客户端 它不会重新使用该通道 并会留下一堆 TCP 连接 直到超时 创建客户端 调用其方法 然后关闭它是正常
  • 如何监控 TCP 连接的 cwnd 和 ssthresh 值? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望在通过套接字连接发送或接收数据包时确定这些值 有没有现有的工具可以做到这一点 The ss http linux die net m
  • 如何将我的 Kivy 客户端连接到服务器(TCP、套接字)

    因此 作为我的项目 2D 多人纸牌游戏 的一部分 我已经弄清楚如何在线托管和运行服务器脚本 我的计划是让两个单独的 kivy 客户端连接到服务器 这只是一个带有命令的脚本 但是我对操作顺序有些困惑 因为我think客户端连接可能与消息循环发
  • 如何识别用户空间和内核空间之间的特定套接字?

    我在用户空间中有一个库 可以拦截套接字层调用 例如socket connect accept 等等 我只处理 TCP 套接字 在内核空间中 我有一个网络内核模块 它处理所有 TCP 连接 我需要能够在驱动程序中识别哪些套接字被用户空间库拦截
  • wireshark 和 tcpdump -r:奇怪的 tcp 窗口大小

    我正在使用 tcpdump 捕获 http 流量 并且对 TCP 慢启动以及窗口大小如何增加感兴趣 sudo tcpdump i eth1 w wget tcpdump tcp and port 80 当我使用 Wireshark 查看转储
  • Linux Socket write() 的错误文件描述符 错误的文件描述符 C

    我对 write 2 函数有一个有趣的问题 PrepareResponseForSetCoordinates 函数会导致写入时出现错误的文件描述符错误 这是错误行 perror 写入套接字时出错 总产量 写入套接字时出错 文件描述符错误 我
  • Node.js 找不到模块“tcp”

    节点在以下行崩溃 var tcp require tcp 错误文本 node js 201 throw e process nextTick error or error event on first tick Error Cannot f
  • Socket ReceiveAsync 合并数据包

    我打算通过套接字接收数据包 但由于它们是从发送方以高频率发送的 因此其中许多数据包被打包成一个byte array SocketAsyncEventArgs Buffer然后保存多个数据包 即使它们是单独发送的 使用验证wireshark
  • syn队列和accept队列的混淆

    在阅读TCP源码时 我发现一个困惑的事情 我知道 TCP 在 3 次握手中有两个队列 第一个队列存储服务器收到的连接SYN并发回ACK SYN 我们称之为同步队列 第二个队列存储3WHS成功并建立连接的连接 我们称之为接受队列 但在阅读代码
  • 如何在java应用程序中检测FIN - tcp标志?

    我在两台计算机之间有持久的 TCP 连接 第二台计算机不受我的控制 第二台计算机可以随时发送FIN标志 并且首先必须关闭当前连接 将FIN标志发送回第二台计算机 我如何知道第二台计算机正在发送 FIN 标志 以及何时必须调用 Java 应用
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • Python套接字模块:Recv()数据响应被切断

    解释 我目前正在尝试使用 python 脚本控制智能电源板 为了实现这一点 我使用了带有套接字模块的 TCP 连接 大约 75 的情况下 我会得到我正在寻找的响应 数据 并且一切都运行良好 然而 大约 25 的情况下 响应会以完全相同的长度
  • C# Socket.receive连续接收0字节且循环中不阻塞

    我正在尝试用 C 编写一个最简单的多线程 TCP 服务器 它接收来自多个客户端的数据 每次连接新客户端时 都会建立套接字连接 并将套接字作为参数传递给新类函数 之后运行 while 循环并接收数据 直到客户端连接为止 这里的问题是 sock
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 访问 AWS 上的 Tensorboard

    我正在尝试访问 AWS 上的 Tensorboard 这是我的设置 张量板 tensorboard host 0 0 0 0 logdir train 在端口 6006 上启动 TensorBoard b 39 您可以导航到http 172
  • iOS 上的多个 HTTP 请求与单个 TCP 连接

    我正在开发一个 iPhone 应用程序 它使用我控制的基于 Web 的 API 连接到持续打开的 TCP 端口并通过 TCP API 发出请求 或者为我想要获取的所有数据发出新的 HTTP 请求 会更快或更高效吗 我认为差异可以忽略不计 但
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw

随机推荐

  • 解决 npm或pnpm : 无法加载文件 C:\Users\bts\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本

    vscode 使用 npm 或 pnpm打开网页时出现此问题 解决方法 点击左下角开始 找到Windows PowerShell 点击右键找到更多 找到以管理员身份运行 输入命令 set ExecutionPolicy RemoteSign
  • 使用禅道 api 添加用户完整流程与分析

    在使用禅道系统时 有时为了方便 需要与其他系统对接 如其他系统添加用户后可以直接同步到禅道系统 而不是在禅道系统重新添加一遍用户 禅道系统提供了二次开发的api 但是里面的内容并不详细 故笔者写这篇文章进行记录 这里先以 postman进行
  • STM32与ESP8266-MQTT固件的应用

    本文以Clion作为编译器 STM32F407作为芯片 通过串口以AT指令与ESP8266 01S进行通信 让其连接到腾讯云物联网平台 一 ESP8266 01S ESP8266 01S原本固件是不支持MQTT的 因此需要在安信可官网去下载
  • mysql union保持原有查询的排序

    摘要 mysql中对union之后的结果进行排序比较简单 但业务中也会遇到需要保持各个union结果集自身的排序情况 本文将介绍一种想要保持union前各个查询结果集的排序规则不变的处理方式 为各个结果集编排独立排序 规则描述与数据准备 数
  • Linux设备驱动入门

    Linux驱动配置 什么是驱动程序 驱动程序是应用层和硬件设备之间的一个软件层 它向应用层提供了一组标准化的调用接口 同时完全隐藏设备的工作细节 无操作系统时的设备驱动 有操作系统时候的设备驱动 有了操作系统之后 设备驱动反而变得更加复杂了
  • 黑白二维数组,判断两个二维数组之间的相似率

    include
  • 排序算法---希尔排序---详解&&代码

    希尔排序 希尔排序 从整体宏观上有序逐步细节到局部的有序 希尔排序是一种改进版的插入排序 普通的插入排序算法中 是从第2个节点开始 依次插入到有序序列中 这种做法虽然 一次成形 但研究发现时间效率上这么做并不划算 希尔排序的时间复杂度为O
  • Maven 父子POM文件 相同依赖不同版本的问题

    Maven 父子POM文件 相同依赖不同版本的问题 默认用父一级的版本 而且子POM文件的版本处会有黄色Warn 解决 增加
  • qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in

    在运行mmdetection的时候发现qt5里面缺了啥 qt qpa plugin Could not load the Qt platform plugin xcb in 卸载了好多Qt5 重新安装 都没有用 尝试1 sudo gedit
  • PHPExcel 表格导出数据

    PHPExcel开发文档 https www kancloud cn chunyu php basic knowledge 1041088 1 控制器 平台订单 导出 功能 订单查询导出 导出 功能 平台订单 导出 public funct
  • WEB刷题第一天

    今天刷了第一道简单题 学到了万能密码 admin or 1 1 用户名和密码均输入万能密码 buuoj cn check php username admin or 1 1 password admin or 1 1 html5判断用输入密
  • 矩阵求逆算法及程序实现(C++)

    矩阵求逆算法及程序实现 C
  • mapper批量插入

    1 常规方式的批量插入 sql语句 int bathNorm List
  • 深度学习笔记3——AlexNet

    1 背景介绍 在2012年的ImageNet竞赛中 AlexNet获得了top 5测试的15 3 error rate 获得第二名的方法error rate 是 26 2 AlexNet有60 million个参数和65000个 神经元 五
  • uniapp跨域问题解决

    一 什么是跨域 出于浏览器的同源策略限制 同源策略是一种约定 它是浏览器最核心也最基本的安全功能 如果缺少了同源策略 则浏览器的正常功能可能都会受到影响 知识点 跨域只会出现在浏览器上 小程序和APP开发不会有跨域问题 二 什么情况下会出现
  • 选址与路径规划问题(Lingo,Matlab实现)

    1 县政府现拟建六个医院 问分别建在何处才能方便广大市民 2 现准备在此县城内建立若干个出警点 为每个出警点分配区域 使在任意 地点发生意外 警察能在 3 分钟以内到达事发地 问如何策划出警点才合 理 请具体给出出警点的位置和个数 警车的时
  • 同时带有QueryString和Body参数的接口,如何用Postman做接口测试

    文章目录 前言 一 好用的抓包工具Charles 1 安装Charles 二 Postman进行接口测试 打开postman 进行操作 总结 前言 有时利用Fiddler抓包抓到一些复杂点的接口 比如是同时带有querystring参数和b
  • 96、ScatterNeRF: Seeing Through Fog with Physically-Based Inverse Neural Rendering

    简介 论文 https arxiv org pdf 2305 02103 pdf 充分渲染雾场景 并从参与媒体中分解无雾背景 提出了散射体和场景物体的解纠缠表示 并学习了基于物理启发损失的场景重建 贡献点 提出了一种通过在体绘制过程中引入K
  • 2012复旦机试

    1 排序问题 1000个成绩输出前30 用堆 数据就随便用的0 999 include
  • 图片详解TCP连接的三次握手,四次断开基本原理

    图片详解TCP连接的三次握手 四次断开 作者 林子 Blog http blog csdn net u013011841 时间 2014年8月 出处 http blog csdn net u013011841 article details