TCP协议格式和特点

article/2025/9/27 1:08:11

文章目录

    • 1.协议格式:
    • 2.协议特性:
      • 2.1 面向链接
        • 2.1.1三次握手建立连接
        • 2.1.1四次挥手断开连接
        • 相关问题和知识点:
          • 1. 握手为啥三次,挥手是四次?
          • 2. 三次握手失败两端是如何处理的?
          • 3. SYN泛洪攻击是怎么回事?
          • 4. 一台主机上出现了大量CLOSE_WAIT状态链接是什么原因?
          • 5. TIME_WAIT状态有什么作用?
          • 6. 一台主机上出现大量TIME_WAIT链接,什么原因,怎么解决?
          • 7. TCP的保活机制(心跳探测)
      • 2.2 可靠传输
        • 2.2.1 安全有序传输(保证数据可靠到达对端并且有序进行交付)
          • 1. 确认应答机制
          • 2. 超时重传机制
          • 3. 协议字段中的序号(th_seq)和确认序号(th_ack)进行包序管理,实现有序交付
          • 4. 协议字段中的校验和校验数据一致性。
        • 2.2.2 避免没必要的丢包
          • 1. 滑动窗口机制
          • 2. 拥塞窗口机制
        • 2.2.3 提高一些传输性能
          • 1. 确认序号
          • 2. 快速重传协议
          • 3. 捎带应答机制:
          • 4. 延迟应答机制
          • 5. 延迟发送机制
      • 2.3 面向字节流传输
    • 3 对应用层编程影响
          • 问题:tcp和udp协议的区别?
          • tcp如何实现可靠传输
          • udp如何实现可靠传输

TCP :传输控制协议

1.协议格式:

在这里插入图片描述

  1. 16位源端端口-16位对端端口:描述通信两端

  2. 32位序号-32位确认序号:用于实现包序管理。

  3. 4位报头长度:描述tcp报头长度。4位表示最大数字15;以四字节为单位,所以TCp报头最小长度20字节,最大为15 * 4 = 60字节。

  4. 6位保留

  5. 6位标志位:

     	URG: 紧急指针是否有效ACK: 确认应答PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段 
    
  6. 16位窗口大小:用于实现滑动窗口机制–进行发送数据的流量控制。防止缓冲区溢出丢包。

  7. 16为校验和:校验数据一致性。

  8. 16位紧急指针:发送的带外数据的位置

  9. 0-40字节选项数据:存储一些可能需要的额外的信息。Mss…

  10. 应用数据

2.协议特性:

2.1 面向链接

面向链接:通信双方建立连接之后才能进行通信,—>确保通信双方都据有数据收发能力

TCP的链接管理:三次握手建立链接,四次挥手断开链接。
主要是为了确认通信双方都在线有数据收发能力。

2.1.1三次握手建立连接

客户端向服务端请求建立连接:
在这里插入图片描述

2.1.1四次挥手断开连接

在这里插入图片描述

相关问题和知识点:

1. 握手为啥三次,挥手是四次?

三次握收:双发都需要确定对方是否具有数据收发能力。两次不安全—只能确定服务端在线,客户端可能发送完SYN请求后就下线了。四次没必要—SYN和ACK都是报文中的标志位,分开发送没太大意义,直接将这两个标志位都置为1同时发送即可。
四次挥手:双方上层只有在不会发送数据的情况下才会发送FIN(FIN表示上层不再发送数据,但下层还能ACK确认回复)。收到FIN请求只能表示对方上层不再send发送数据,不代表对方不能再收数据了。因此有可能接收FIN请求的一方还会继续给对方发送数据,只有在上层调用了close或者shutdown关闭写才会主动给关闭方发FIN(不再发数据了).所以被动关闭方的FIN和ACK默认不一起发送。

2. 三次握手失败两端是如何处理的?

握手失败情况:
1.SYN请求丢失,客户端没得到确认回复,隔一段时间会重新发送SYN请求。多次发送失败会导致请求超时,连接失败。
2. 服务端发送的ACK+SYN信息丢失。客户端没收到SYN导致服务器没收到相应的的ACK回复,新建的套接字会重新发送ACK+SYN请求。若服务端发送ACK+SYN请求超时(服务端可能会觉得这是恶意攻击请求,只发起连接不回复,占用资源),给客户端发送RST重置连接报文,释放新建套接字的资源。
3. 客户端最后发送的ACK丢了。服务端等待超时,服务端发送RST,释放资源,从新建立连接。

3. SYN泛洪攻击是怎么回事?

黑客伪造ip不断向服务端发送SYN,但是不进行ACK回复,服务端新创建套接字会不断占用资源,直至枯竭崩溃。所以listen(sockfd,backlog)接口中有backlog参数–新建连接队列–队列满了就不会再新建套接字。处理方法:防火墙–同一ip频繁发送数据则拉黑名单。

4. 一台主机上出现了大量CLOSE_WAIT状态链接是什么原因?

CLOSE_WAIT状态是被动关闭方收到FIN请求并进行ACK回复之后进入到的状态。一旦自己发送了FIN(close操作后就会发送FIN)则会进入下一个LAST_ACK状态,因此有大量CLOSE_WAIT,意味着代码中可能没有对连接断开的套接字进行close操作。解决方案就是检查代码。

5. TIME_WAIT状态有什么作用?

在这里插入图片描述
TIME_WAIT状态是主动关闭方在收到对方FIN后,进行最后一次ACK回复后进入的状态。如果最后一次ACK丢失了,被动关闭方等待没收到ACK,则会重新发送FIN(只重传一次),所以TIME_WAIT状态就是等待这次可能重传的ACK。
TIME_WAIT实际上是为了保护新建套接字不会使用刚被释放的套接字的地址和端口,防止原先通信的数据对新连接造成的影响(本来需要发送到原先套接字的重传FIN发送送到了新套接字的通信会话中)。
TIME_WAIT会等待两个MSL(最大报文生存周期)时间---->最后重传FIN和ACK的时间 X 2,确保本次通信的数据都消失在网络中,不会对新的连接造成影响。
TIME_WAIT实际上更多是为了保护客户端,客户端通常不主动绑定地址信息,交给系统分配;而服务端通信通常需要绑定相同的地址信息,重启之后地址信息不变。
在这里插入图片描述

6. 一台主机上出现大量TIME_WAIT链接,什么原因,怎么解决?

TIME_WAIT是主动关闭方最后一次发送ACK产生的。
出现大量TIME_WAIT则是因为大量主动关闭套接字,常见于爬虫主机。
解决方案:将TIME_WAIT等待时间设置更短一些。
或:设置套接字选项,开启地址复用,常见于服务端。
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
level:SOL_SOCKET
optname:SO_REUSEADDR

7. TCP的保活机制(心跳探测)

默认情况:通信双方7200s没有通信,则服务端每隔75s会向客户端发送一个保活探测数据包,要求客户端进行回复,连续9次没有进行回复则认为连接断开。
可以设置保活时间和次数。
连接断开在后程序在上层的表现:recv返回0;send会触发SIGPIPE异常—>会导致进程异常退出,可自定义SICPIPE信号的处理方式。
在这里插入图片描述

2.2 可靠传输

2.2.1 安全有序传输(保证数据可靠到达对端并且有序进行交付)

面向链接(前提):首先确保双方都具有数据收发能力

1. 确认应答机制

实现丢包检测功能,接收方针对接收的每一条数据都应该进行确认回复。
发送方收到确认回复认为传输成功,否则认为数据丢包。

2. 超时重传机制

发送方等待超时没有得到确认回复,则会对数据包重新传输。超时等待时长会随着网络环境的不同, 是有差异的.如果超时时间设的太长, 会影响整体的重传效率;如果超时时间设的太短, 有可能会频繁发送重复的包;

3. 协议字段中的序号(th_seq)和确认序号(th_ack)进行包序管理,实现有序交付

利用==协议字段中的序号(th_seq)和确认序号(th_ack)==进行包序管理,实现有序交付。
在这里插入图片描述
举个例子感受一下序号(th_seq)和确认序号(th_ack)的作用,下图中seq为其实序号,ack表示确认序号。
在这里插入图片描述

4. 协议字段中的校验和校验数据一致性。

数据不一致则丢弃,丢弃则无针对此数据的确认回复,对方收不到确认回复则重传此数据;也可直接发送重传请求。

2.2.2 避免没必要的丢包

丢包情况:

  1. 发送方发送数据过多,接收方来不及处理,缓冲区溢出之后所产生的丢包。
    2.>传输起始或者过程中网络突然变差所导致的大量丢包。
1. 滑动窗口机制

依赖于协议字段中的窗口大小字段实现,避免发送方发送数据过多,接收方来不及处理,缓冲区溢出之后所产生的丢包。
原理:接收方接收数据之后就会进行确认应答,这时候会通过窗口大小字段告诉对方最多再给自己发送多少数据。窗口大小不能大于接收缓冲区剩余空间大小。
实现:通信双方都会维护一个发送窗口和接收窗口。
图画不动了,参考文章:网络 滑动窗口机制,这个里面有比较图解,过程较详细。

相关概念:

MSS:最大数据段大小,表示一个TCP报文中数据的最大大小。

相关协议:

停等协议:发送数据之后,收到确认回复才会发送下一条。适合网络环境差的场景。
回退n步协议:那一条数据丢失,则从丢失的数据包开始整体重传。
选择重传协议:哪条丢失重传哪条。适用于网络环境较好的场景。
2. 拥塞窗口机制

拥塞窗口机制:解决网络突然变差产生大量丢包的问题。
原理:发送方维护了一个拥塞窗口,用于限制当前所能发送的数据量。拥塞窗口大小是一种慢启动快增长(指数上涨,阈值为窗口大小)的形式进行传输控制。防止突然网络变差,导致大量丢包。每次丢包都会进行一次网络状况探测的过程。

2.2.3 提高一些传输性能

tcp为了实现可靠传输,牺牲了传输性能,而在传输过程中,有些性能上的损失是没有必要的。

1. 确认序号

确认序号标识序号之前的数据都已经收到了,为了避免因为确认应答丢失导致的重传。

2. 快速重传协议

在传输过程中,若接收方接收到的数据并非是接收窗口后沿数据,则有理由认为前边发送的数据丢失了,这时候每收到一条数据就会发送一条后沿数据的重传请求,一旦发送方连续收到三条(三条是为了避免数据延迟到达的情况)相同重传请求,则直接对这条数据(确认序号的数据)进行重传。丢包后不用完全等待超时重传,节省时间。

3. 捎带应答机制:

接收方对接收到的每一条数据都需要进行确认回复,然而确认回复最主要的信息就是确认序号,因此每一条确认回复都是一个tcp传输,至少是一个空报头(没有实际数据)的传输。如果收到数据后刚好要给对方发送数据,则将及即将要发送的数据和确认回复放到一起进行发送(在要发送的数据报头中加入确认序号)。

4. 延迟应答机制

接收方对接收到的每一条数据都需要进行确认回复,其中包含有当前窗口大小字段,如果立即进行回复,窗口大概率是不断减小的,因此延迟进行确认回复,有可能上层将数据取出,维持窗口大小。通过这种方式保证传输吞吐量不会降低。

5. 延迟发送机制

tcp传输过程中,如果对每次send的数据直接封装报头进行发送,若发送的数据比较小,但是次数较多,则io次数比较多,效率低。因此延迟发送,将数据在发送缓冲区中先堆积起来,再合适的时候一次性发送,减少了io次数,提高效率。
nagle算法–通过套接字选项设置(默认是开启的)

2.3 面向字节流传输

面向字节流传输:可靠的,有序的,双向的,基于连接的,以字节为单位的传输方式。传输时,并不限制上层(send \ recv)发送或者接收的数据大小。tcp延迟发送数据在缓冲区中积攒,基于mss取出合适大小数据进行发送。
优势:相对于面向数据报来说,传输更加灵活。
缺陷:产生粘包问题—将多条数据当作一条数据处理。
产生粘包的原因:tcp不会对数据进行边界处理。
解决方案:程序员需要在应用层进行数据的边界管理。可用特殊字符作为间隔(需要考虑特殊字符转译);使用TLV格式数据(在应用层头部加入数据长度);数据定长----提前约定会定长的数据,但是数据太短需要进行补全;

3 对应用层编程影响

  1. 连接断开:recv返回0,send触发异常。
    recv一旦返回0,就要考虑文件描述符的回收关闭
    Send因为会触发一次导致进程退出,若不想退出进程需要自定义信号处理。
  2. tcp传输存在粘包问题,需要在应用层进行数据边界管理。udp整条交付,无粘包问题。
问题:tcp和udp协议的区别?

实现上的区别:协议格式,协议字段不一样。
特性上的区别:TCp是面向连接的可靠的字节流传输方式。udp是无连接不可靠面向数据报的传输方式。udp支持广播,tcp不支持。
应用场景上的区别:UDP适用于实时性高于安全性的场景,tcp用于传输安全性高于实时性的场景。

tcp如何实现可靠传输
  1. 确认应答机制
  2. 超时重传机制
  3. 协议字段中的序号(th_seq)和确认序号(th_ack)进行包序管理,实现有序交付
  4. 协议字段中的校验和校验数据一致性。
udp如何实现可靠传输

ud协议本身没有实现可靠传输,需要在应用层手动实现类似tcp的可靠传输机制:确认应答机制,超时重传机制,包序管理。


http://chatgpt.dhexx.cn/article/GwLgFxAx.shtml

相关文章

典型几种协议(协议以及作用)

一 .典型协议: 传输层: 常见的协议有 TCP/UDP 协议 应用层: 常见的协议有 HTTP,FTP 协议 网络层: 常见的协议有 IP 协议,ICMP 协议,IG…

ICMP协议 详解,ICMP协议的功能及实现原理,ICMP协议报文类型。

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」:此文章已录入专栏《计算机网络零基础快速入门》 ICMP协议 一、工作原理二、数据报格式三、报文类型 ICMP协议是IP的…

几个的常见基础协议类型数据格式以及协议内容简介

给大家简单梳理一下几种学习中常会出现的协议格式,咋们数通就像交通,各种各样的协议规则来规范大家,制定科学的管理手段来帮助大家快速,安全的到家。 一、 HDLC协议 HDLC叫高级链路控制协议(High Level Data Link Cont…

几种常用协议介绍

几种常见协议介绍 TCP/IP协议,其实是一个协议集合,这个集合里面包含了网络通讯所需的所有协议,里面不仅有TCP(传输控制协议)、IP(网际协议),还有UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP、TFTP等许多协议,还有物联网中…

个人如何申请注册公司邮箱?企业邮箱注册申请流程详解

大部分人可能知道邮箱,但是公司邮箱是什么?企业邮箱注册申请流程?个人如何申请注册公司企业邮箱? 在一家公司实习时人事告诉我使用公司邮箱,用我名字拼音命名的,还是无限容量、单次群发500封、邮件误删可以…

手把手教你申请CCC(City Colleges of Chicago)教育邮箱

如果你还不知道edu教育邮箱的好处,那么你就out了,很多大公司的的优惠福利专门针对学生群体。比如可以利用edu邮箱获得Office365免费使用权限,可以免费扩容Onedrive至1024GB;可以获得AutoCAD、3ds Max、Maya等在内70余款软件的3年免…

工大校园邮箱申请流程

由于pycharm破解日益复制,代理服务器总是被封杀,只好老老实实合法使用,但还是要免费的方法,那就申请学生邮箱,毕竟钱不是问题,穷才是。 第一步打开这个网址,登陆一下 https://cas.bjut.edu.cn…

matlab 柱面投影,matlab练习程序(圆柱投影)

圆柱投影就是将一张二维的图像投影到三维的圆柱体上,不过在显示图像的时候依然是以二维的形式给出。 投影最重要的步骤就是计算投影变换公式,和图像旋转类似,只要得到变换公式,再依照公式进行代码编写就很容易了。 这里就不写投影…

C/C++ 图像处理(8)------图像の柱面投影算法

图像的柱面投影算法,在360环形全景应用中几乎一定会用到。而为何要用该算法,可以参考下图: 从图像中可以看到,該环形全景设备由八个摄像头环形排列而成(需注意环形全景的形态并不固定,摄像头的个数不一定是八个,甚至只有一个摄像头在一直匀速转圈也是可以的)。每个摄…

全景图(二):在Unity3D上实现360°柱面投影

在全景图(一):使用Unity完成水晶球纹理贴图 建立的工程基础之上,做修改。 步骤: 1、把上次创建好的水晶球移走,放到一个不妨碍观察的地方。 2、创建一个圆柱体,位置设为(0,1.5,0&a…

图像拼接(一):柱面投影+模板匹配+渐入渐出融合

这种拼接方法的假设前提是:待拼接的两幅图像之间的变换模型是平移模型,即两幅图像同名点位置之间只相差两个未知量: Δx 和 Δy ,自由度为2,模型收得最紧。所以只有所有图像都是用同一水平线或者同一已知倾斜角的摄像机…

2D射影儿何和变换——柱面投影,图像拼接柱面投影

引入二维空间(以下简称2D) 的射影变换 这些变换发生在用透视摄像机对平面摄像的时候. 该章偏重于入门介绍并为三维空间(以下简称3D) 几何铺路. 大多数的概念在2D 中比3D 中更容易理解和可视化. 本章介绍射影变换,包括它的特殊悄况:仿射和相似变换; 并把注意力…

鱼眼图像与柱面的投影

鱼眼图像到柱面的反投影及柱面到鱼眼图像的投影 https://blog.csdn.net/c20081052/article/details/80999904 鱼眼图像到柱面图像的投影公式推导参考链接,自己照着推导过,应该是没有问题的。这个是平面图像到柱面的投影,我理解的鱼眼图像也是…

【论文笔记】激光点云柱面投影图的显著性检测 LiDAR Imaging-based Attentive Perception

内华达大学里诺分校 在嵌入式处理器设备上(飞行器)达到了毫秒级执行时间, 使用的激光雷达型号 :  OUSTER OS1-64 (图像尺寸204810),OUSTER OS0-128(图像尺寸204810) 这种激光雷达可以提供的信息包括: 距离, 强度, 反射…

图像拼接---图片柱面投影简单实现

算法思想参考:http://blog.csdn.net/weixinhum/article/details/50611750 柱面投影是图片拼接的前期的一部分工作,以下代码只是简单的实现了投影,还可以优化, 柱面半径设置位图片宽度的一半,即 R width/2 代码运算…

2.8 投影柱面

空间曲线 在xOy坐标面上的投影曲线是 投影柱面的参数方程为 例 2.8.1 将以下空间曲线投影到xOy坐标面,试作出投影柱面的图形。 解 输入以下代码: with(plots): x:t->cos(t): y:t->sin(t): z:t->t: S:2: T:6:K:50: quxian:spacecurve([x(t),y(t…

【Opencv】2D射影儿何和变换——柱面投影,图像拼接柱面投影

引入二维空间(以下简称2D) 的射影变换 这些变换发生在用透视摄像机对平面摄像的时候. 该章偏重于入门介绍并为三维空间(以下简称3D) 几何铺路. 大多数的概念在2D 中比3D 中更容易理解和可视化. 本章介绍射影变换,包括它的特殊悄况:仿射和相似变换; 并把注意力主要…

matlab 柱面投影,图像拼接(不投影到柱面)(渐入渐出融合) matlab程序

1,先拍摄一组图片,比如两幅图:A、B 我直接用网上的两幅图: 2,分别投影到柱面坐标系 就用自己写的柱面投影程序 matlab里 结果: 3,开始配准第一步:SIFT得到匹配对(直接用OpenCV里自带的) 有两三对误匹配对,后来调整阈值得到没有误匹配对的结果。 4,配准第二步:根据匹…