UDP与TCP报头介绍,三次握手与四次挥手详谈

先介绍我们UDP/TCP协议缓冲区

在UDP和TCP在数据传输和介绍时有有缓冲区概念的。

UDP缓冲区

UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后 续的传输动作;

UDP具有接收缓冲区. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果 缓冲区满了, 再到达的UDP数据就会被丢弃;

TCP缓冲区

TCP在内核中是具有接收缓冲区和发送缓冲区的。

TCP和UDP由于他们的发送缓冲区和接收缓冲区是独立的(尽管udp没有真正发送缓冲区),所以使用TCP和UDP通信是全双工状态的。

udp协议报头介绍

报头也是结构体。

为了节约紧凑数据,降低内存对齐问题,我们的结构体使用位段结构。

不做数据浪费,tcp报头数据结构也是使用位段结构

UDP报头内容介绍

原端口号:发送方的端口号,接收方再给发送方发送数据时候,可以依据端口发送到对应的主机中特定的进程。

目的端口号:发送方机器上绑定该端口的进程。

UDP长度:整个UDP报文(报头+数据)长度,确定数据长度用的,UDP报头是固定的8字节,所以16位UDP报文长度-8字节就是数据长度。

16位UDP检验和:检测这次数据发送情况,如果有误直接将整个报文丢弃。

检验和的检测我们后面讲完TCP报文后一起说。

UDP协议注意事项

  • 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接;
  • 不可靠: 没有确认机制, 没有重传机制; 如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层 返回任何错误信息;
  • 面向数据报: 不能够灵活的控制读写数据的次数和数量

数据报文:报头固定,以一个一个报的发送方式,不考虑

无连接:意味着不需要链接就可以直接对某个服务器发送数据。

不可靠:这并不是一个贬义词而是中性词,不可靠意味着,我们发出数据后不用管数据是否抵达,我们只管发送就行了。不需要太多的编写和维护成本。

注意事项

UDP数据报文如果超过了64K数据,数据报会变成2个UDP报,我们需要手动拼接数据。


tcp协议报头介绍

TCP协议特点与报头内容

这里我们讲报头内容和特点是相辅相成的

确认应答机制:每条报文发送对方都会返回一条确认报文

对应使用的是32位序号32位确认序号。

这两个选项都存在于tcp报文中,为什么不能直接用一个报文呢?

如果我们使用同一个序号,在client多次发送报文后,server将无法对client也发送报文只等应答所有报文,才可以发送数据,这是极其不合理的。只有你在发不让我发送?所以一般来说在通信的过程中,应答报文和常规通信报文是一起发送的,单纯应答报文不带数据的,所以对常规报文携带的数据不会有影响。

观察画图,会发现我们的应答报文的确认序号是发送报文序号+1。

也就是说,client发送序号:1000报文,server发送确认序号:1001报文。

这是为了, 告诉发送者, 我已经收到了哪些数据; 下一次你从哪里开始发。

server发送确认序号:1001报文,告诉client我已经收到了1000报文,下次从1002开始发送。

这里的序号和确认型号分别还有知识点。

序号

在接收到多次数据时候,依托确认序号得知发送的序号。

因为在网络中传输数据的时候,发送3条报文的序号是,1000、2000、3000的。网络中是无序的,有可能接收方接收到的数据报文序号是,2000、1000、3000,这个时候如果是一份大的数据发送,我们需要将3条报文数据合并,但是必须得知道合并顺序,否则数据会乱序。

所以我们需要使用接收到的报文中的序号对报文重新排序。

确认序号

如果类似上面发送“床前明月光.....”大型报文,我们需要发送到多条报文才可以将全部数据发送完毕。所以我们发送了3条报文给server端,按道理来说我们需要对3条报文发送3次确认应答报文。但是这是没有必要的,server端会检测3条报文是否属于同组报文并且检测数据是否存在丢失,如果没有丢失数据,就应答最后序号的报文,发送应答报文,如果发现丢失数据,就发送丢失报文的前一个报文。

 4位的首部长度

4位首部长度,是tcp报文的报头长度,4位比特位最大为15(1111)值,但是我们的标准报头就有20个字节,并且还有可能增加选项(选项也属于报头),所以约定了,4位首部长度的单位是4字节,也就是说15*4=60个字节,也即是最大报文长度位60字节。但是一个tcp报文至少必须有标准报头20字节,所以4位首部长度范围是:5~15;

16位窗口大小

如果我们的client端一致给server发送报文,但是我们的server端真正处理一个重要的报文,也就是说发送速度和处理报文速率不相等,导致了server端的接收缓冲区满了或者快满了,这个信息必须通知发送方client。

servser当前缓冲区以使用980/1000,server需要使用一种发送将当前链接的接收缓冲区情况通知client,server将自己的接收缓冲区剩余情况发送给client。

偏移量数据,当出现紧急报文时候,立刻服务器立刻优先执行该报文,提托紧急数据选项,查看服务器情况。


到这里发现这6个位我们并没有介绍,我们在三次握手和四次挥手中一同介绍。

三次握手和四次挥手

三次握手

介绍报文类型:

  • SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
  • ACK: 确认号是否有效
  • RST:链接重置(server重启,旧链接发送数据立刻会被链接重置;三次握手最后的ACK失败,但是client发送数据,被server要求链接重载)

我们的链接的过程其实就是三次握手的过程。

这三次握手必须是客户端和服务器都3次握手才是链接成功建立。

三次握手后,将公钥密钥的交流发挥到了极值

三次次握手的意义

1、防止低级SYN洪水

防止SYN洪水攻击,如果只有一次握手或者两次,恶意分子可以使用client端向我们的server发送大量的恶意的链接请求,并且自己不处于链接状态。

一次:恶意攻击,直接大量发送SYN报文,并且自己不处于链接状态。

二次:对方链接建立成功,给我们返回ACK报文,直接丢弃,不建立链接。

大量的链接需要服务器维护为该链接的缓冲区,数据结构等等,当到了一定的数量,服务器将再也接收不了链接,甚至崩溃。

为什么3次链接可以有效预防被一台client搞崩的情况呢?

一般而言都是client向server发送链接请求的,在最后一次握手client发送ACK报文后处于先链接状态,而server只有在接收到ACK报文才会处于链接态,说明了client必须链接成功才能让server链接成功,client和server维护相同数量的链接以相关结构体数量。一般而已,server的能力远大于client,所以一台设备client攻击服务器,自己先会崩溃。(但是如果几十万台服务器同时攻击,这就不是三次握手能解决的了)

而三次握手

Client必须承受和Server一样的链接数量。

2、测试全双工通路

client发送SYN给server后,接收到server发送的SYN+ACK,证明了client的接收通路和发送通路畅通

server接收client发送的SYN后,发送SYN+ACK,进入等待后再次接收到ACK确认应答,证明了        server的接收通路和发送通路畅通。

四次挥手

链接断开时需要做的工作。

FIN: 通知对方, 本端要关闭了

断开链接需要双方同时做四次挥手的动作:client端做4次挥手动作,server端也要做4次挥手动作。就像签署离婚协议一样,需要双方签字才生效。

我们server调用close关闭套接字。


理解 CLOSE_WAIT 状态

服务器测试代码:我们只链接客户端,当客户端关闭的时候我们链接不退出。

服务器客户端一同启动。建立链接成功,我们查看一下链接情况。

因为我们使用的是本地链接所以链接是一样的,查看state,发现我们的client和server都处于ESTABLISHED状态,正常通信状态。

我们将客户端关闭。

再次观察连接情况

选择服务器server变成了CLOSE_WAIT状态并保持,客户端变成FIN_WAIT2状态,应证了如果client端发送断开链接,如果服务器在收到断开FIN后并没有执行close函数,关闭套接字的话,服务器和客户端依旧处于临界状态,并且这个状态不会随着时间而关闭,链接必须一定等待server调用close发送FIN才可打破这种状态。这是很关键的一个地方,如果链接一直未关闭,服务器过载将发送崩塌,我们该错误称之为文件描述符泄露。

理解TIME_WAIT状态

TCP协议规定,主动关闭连接的一方要处于TIME_ WAIT状态,等待两个MSL(maximum segment lifetime) 的时间后才能回到CLOSED状态

如果是客户端关闭链接,就是客户端进入TIME状态,等待

如果是服务器关闭链接,就是服务端进入TME状态,等待

在TIME_WAIT状态下的一方会进入TIME_WAIT状态,依旧可以接收信息,在等待2MSL时间下下,一个MSL是在网络通信中最远距离通信的时间,这一般由各个linux确定,在Centos7上默认配置的值是60s。使用cat /proc/sys/net/ipv4/tcp_fin_timeout,查看MSL时长

为什么需要TMIE_WAIT状态呢?

  1. 防止在关闭后网络中依旧有的报文数据需要被接收,我们需要将这些报文做消散处理,避免短时间内再次通信时,收到了上次旧时报文。
  2. 如果第4次挥手时,ACK发送丢包,被动断开方会再次发送FIN数据,请求断开,这个时候如果,没有TIME_WAIT状态,那么被动断开方将无法收到ACK反馈(但是也没啥,如果发送一定次数后依旧没有ACK状态,被动接收方也就直接断开链接了)。

在TIME_WAIT下再次接收到FIN,将再次发送last ACK,然后重置TIME_WAIT时间重新等待

解决服务器TMIE_WAIT时需要紧急重启

在server的TCP连接没有完全断开之前不允许重新监听, 某些情况下可能是不合理的

  1. 服务器需要处理非常大量的客户端的连接(每个连接的生存时间可能很短, 但是每秒都有很大数量的客户 端来请求).
  2. 这个时候如果由服务器端主动关闭连接(比如某些客户端不活跃, 就需要被服务器端主动清理掉), 就会产 生大量TIME_WAIT连接.
  3. 由于我们的请求量很大, 就可能导致TIME_WAIT的连接数很多, 每个连接都会占用一个通信五元组(源ip, , 协议). 其中服务器的ip和端口和协议是固定的源端口 . 如果新来的客户端连接的 , 目的ip, 目的端口 ip和之前关闭的一样,会造成数据混乱。端口号和TIME_WAIT占用的链接重复了, 就会出现问题.

我们可以使用使用setsockopt()设置socket描述符的 选项SO_REUSEADDR为1, 表示允许创建端口号相同但IP地址不同的多个 socket描述符.

int opt=1;
setsockopt(_listen_socket,SOL_SOCKET,SO_REUSEADDR|SO_REUSEPORT,&opt,sizeof opt);

其实就是跳过判定端口是否被占用的代码。虽然可能数据混乱,但是比较服务器需要等待的损失会较小点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/81455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++智能指针种类以及使用场景

一、指针管理的困境 资源释放了,指针没有置空 野指针:只有一个指针指向资源 指针悬挂:多个指针指向同一个资源 踩内存 没有释放资源,产生内存泄漏 重复释放资源,引发 coredump 二、如何解决? 智能指针采…

C语言天花板——指针(初阶)

🌠🌠🌠 大家在刚刚接触C语言的时候就肯定听说过,指针的重要性以及难度等级,以至于经常“谈虎色变”,但是今天我来带大家走进指针的奇妙世界。🎇🎇🎇 一、什么是指针&…

旋转角度对迭代次数的影响

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由5张二值化的图片组成,让A中有3个1,B中全是0,统计迭代次数并排序。 在3*5的空间内分布3个点有19种可能,但不同的分布只有6种 差值就诶够 …

CSS 文本超出省略

单行省略 width: 200px; /* 容器宽度 */ white-space: nowrap; /* 不换行 */ overflow: hidden; /* 溢出隐藏 */ text-overflow: ellipsis; /* 超出部分省略 */多行省略 display: -webkit-box; -webkit-line-clamp: 2; /* 限制行数 */ -webkit-box-orient: vertical; /* 文本…

七天学会C语言-第二天(数据结构)

1. If 语句&#xff1a; If 语句是一种条件语句&#xff0c;用于根据条件的真假执行不同的代码块。它的基本形式如下&#xff1a; if (条件) {// 条件为真时执行的代码 } else {// 条件为假时执行的代码 }写一个基础的If语句 #include<stdio.h> int main(){int x 10;…

硬件故障诊断:快速定位问题

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Vue3+element plus+sortablejs实现table列表拖拽

1、安装 npm install sortablejs --save2、引入 import Sortable from sortablejs;3、使用 表格表头必须加row-key&#xff0c;否则会出现排序错乱完整代码table.vue <el-table v-loading"loading"row-key"id":height"tableHeight"ref&qu…

Linux基础开发工具使用快速上手

软件包管理器 概念理解 在Linux下安装软件的话&#xff0c;一个比较原始的办法是下载程序的源代码&#xff0c;然后进行编译&#xff0c;进而得到可执行程序&#xff0c;然后就可以运行这个软件了。但是这种做法太麻烦了&#xff0c;于是就有些人把一些常用的软件提前编译好&…

Python子进程管理与进程信息获取

1. Python子进程模块subprocess subprocess 模块允许我们启动一个新进程&#xff0c;并连接到它们的输入/输出/错误管道&#xff0c;从而获取返回值。 &#xff08;1&#xff09;run 方法 首先我们来看看 run 方法的使用&#xff0c;该方法的参数如下&#xff1a; args&…

笔记1.5:计算机网络体系结构

从功能上描述计算机网络结构 分层结构 每层遵循某个网络协议完成本层功能 基本概念 实体&#xff1a;表示任何可发送或接收信息的硬件或软件进程。 协议是控制两个对等实体进行通信的规则的集合&#xff0c;协议是水平的。 任一层实体需要使用下层服务&#xff0c;遵循本层…

uniapp 小程序 父组件调用子组件方法

答案&#xff1a;配合小程序API > this.selectComponent("")&#xff0c;来选择组件&#xff0c;再使用$vm选择组件实例&#xff0c;再调用方法&#xff0c;或者data 1 设置组件的id,如果你的多端&#xff0c;请跟据情况设置ref,class,id&#xff0c;以便通过小…

区块链(1):区块链简介

区快链是通过密码技术保护的分布式数据库这是比特币背后的技术。 本文将逐步带您了解区块链。 1 区块链BLOCKCHAIN的类的定义 区块链有一个区块列表。 它从一个单独的块开始&#xff0c;称为 genesis block【创世区块】 2 区块链BLOCK的类的定义 第一个区块叫做 Genesis[…

QT5到QT6产生的一些变化【QT环境搭建篇】

1、QT 重写enterEvent 鼠标进入事件没有作用 widget中的事件函数 由原来的event(QEvent *event) 变为enterEvent(QEnterEvent *event) 重写改成这样就可以了 void enterEvent(QEnterEvent *event); 2、error C4996: QString::SkipEmptyParts&#xff08;“SkipEmptyParts”:…

一阶低通滤波器滞后补偿算法

一阶低通滤波器的推导过程和双线性变换算法请查看下面文章链接: PLC算法系列之数字低通滤波器(离散化方法:双线性变换)_双线性离散化_RXXW_Dor的博客-CSDN博客PLC信号处理系列之一阶低通(RC)滤波器算法_RXXW_Dor的博客-CSDN博客_rc滤波电路的优缺点1、先看看RC滤波的优缺点…

Redis 篇

1、为什么要用缓存&#xff1f; 使用缓存的目的就是提升读写性能。而实际业务场景下&#xff0c;更多的是为了提升读性能&#xff0c;带来更好的性能&#xff0c;带来更高的并发量。 Redis 的读写性能比 Mysql 好的多&#xff0c;我们就可以把 Mysql 中的热点数据缓存到 Redis…

设计模式:组合模式

目录 组件代码实现优缺点源码中应用总结 组合模式是一种结构型设计模式&#xff0c;用于将对象组织成树形结构&#xff0c;以表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象&#xff0c;而不需要区分它们之间的差异。 在组合模式中&#x…

Linux学习第14天:Linux设备树(一):枝繁叶茂见晴天

本节笔记主要学习了Linux设备树相关知识点&#xff0c;由于内容较多&#xff0c;打算分两天进行总结。今天着重学习Linux设备树&#xff0c;主要包括前三节内容&#xff0c;分别是概念、格式和语法。 本节思维导图内容如下&#xff1a; 一、什么是设备树 设备树可以用一个图来进…

Vivado XADC IP核 使用详解

本文介绍Vivado中XADC Wizard V3.3的使用方法。 XADC简介 XADC Wizard Basic Interface Options&#xff1a; 一共三种&#xff0c;分别是AXI4Lite、DRP、None。勾选后可在界面左侧看到相应通信接口情况。Startup Channel Selection Simultaneous Selection&#xff1a;同时监…

qt4,qt5,qt6嵌入式linux运行Qt程序不同的地方

下面为Qt 4、Qt 5 和 Qt 6分别举例说明它们在嵌入式Linux上运行Qt程序的一些不同之处&#xff1a; Qt 4 示例场景&#xff1a; 假设你正在开发一个嵌入式Linux设备上的控制面板应用程序&#xff0c;该应用程序使用Qt 4。 不同之处&#xff1a; 构建系统&#xff1a; 使用qma…

长胜证券:煤价突破900元大关 GLP-1减重药进入集中获批期

上星期五&#xff0c;两市股指早盘震动上扬&#xff0c;午后回落走低。到收盘&#xff0c;沪指跌0.28%报3117.74点&#xff0c;深成指跌0.52%报10144.59点&#xff0c;创业板指涨跌0.45%报2002.73点&#xff0c;科创50指数涨0.71%&#xff1b;两市合计成交7217亿元&#xff0c;…