TCP&&UDP&&面向字节流&&面向数据报&&报文的理解&&大小端

TCP&&UDP&&面向字节流&&面向数据报&&报文的理解&&大小端

报文的理解

  • 报文的内核结构体sk_buff
  • 报文在协议栈上的传递本质就是SK_ buff结构体的传递
  • 封装报头就是把data指针进行移动,然后强转为对应的报头结构体指针填充数据
  • 解析报文本质也是data指针的移动,当我们把传输层的报头去掉之后就可以把携带的有效载荷放到我们传输层的接收缓冲区中

TCP

**特点:**面向连接、可靠、面向字节流

序号与确认序号

  • 序号的定义:我们可以把发送缓冲区当作是一个字节流数组,我们发送的时候比如发送一到一百的报文,此时的序号就是一百。
  • 序号的作用:确认应答;按序到达;去重;去重可以考虑发送方的报文被我方收到但是应答丢失的情况
  • .确认序号的定义:代表历史上我所收到的数据在确认序号之前我都完全收到了,通常是序号加一。
  • 确认序号的理解:有了确认序号我们不避对每一个请求做应答,比如发送了四个报文我们允许有一两个应答丢失只要一个报文的AC K发送过去对端就知道我收到了多少的数据,对端可以根据我们返回的报头的确认序号来确认是否有报文丢失接着进行报文的发送。确认序号也是实现延迟应答的最根本机制。
  • 为什么报头字段中要有两个序号?因为我们的捎带应答,就是在一次通信的过程中我既可能要对历史消息进行应答,还同时要对我发送的数据标明序号。

四位首部长度

  • 四位首部长度的基本单位是四个字节,因为我们的TCP报头不带选项的话是二十字节,四位首部长度就是代表了整个TCP报头的大小包含我们的选项。

标志位

  • URG :该标志位和我们的16位紧急指针配合使用,用于将对端接收缓冲区16位紧急指针指向的位置尽快被应用层处理,但是由于紧急数据属于带外数据,大小为一字节,因此我们可以考虑传一些状态位来表达更多的信息。
  • ACK:代表该报文是一个响应报文
  • PSH:该字段催促对方的应用层快速读取内核缓存区的内容 ,相当于使对方操作系统地读事件就绪,至于应用层读不读跟操作系统没有关系,操作系统已经做了自己所有的事情,应用层不处理代表是应用层的bug
  • RST: 该标志位代表重置连接。因为我们在建立一个TCP连接的时候要进行三次握手,首先发送方先发送一个SYN,这代表发送方的第一次握手成功;紧接着发送方收到对方的ACK,这代表发送方的第二次握手成功;接着发送方再次发送SYN代表第三次的握手成功;但是此时我第三次握手发送的SYN对端可能没有收到,这就导致了发送端三次握手成功接收端发三次握手失败,因此在发送端的视角下次他以为连接已经建立成功就会发送带有数据的TCP报文,服务器收到之后就会重置链接。
  • SYN: 该标志代表进行同步通常用于三次建立三次握手。
  • FIN: 该标志通常用于四次挥手中代表该报文字段是进行断开连接的报文

16位窗口大小

16位窗口大小指的是对端接收缓冲区此时可用空间的大小该字段可以很好的协商双方之间的接收能力从而发送适量的数据进行我们的流量控制。这个字段通常在三次握手建立的时候进行协商。由于窗口大小是16位就限制了它的最大容量默认的话它的容量就是2的16次方但是在选项中可以加一个字段来对该字段进行扩充。

16位紧急指针

16位紧急指针和我们的标志为URG配合使用,当收到的报文URG被为一的时候就去看该字段,根据该字段找到接收缓冲区的特定位置的一个字节的数据尽快发送到应用层中。因为数据只有一个字节,为了我们传递更多的信息,我们可以把这个字节传递我们的状态位从而传递更多的信息。

可靠性

  • 校验和

  • 序列号:保证了我们报文的有序性以及我们的独立性

  • 确认应答:确认应答只是对历史消息进行可靠性的保证

  • 超时重发机制:当我们一个报文发送之后内核会启动定时器功能,当我们一直收不到AC K时我们会等待,等待的时间如果超过这个设定设定的超时时间,就会把该报文重新发送到对端。该技术的实现是因为TCP的发送缓存区中,一直保存着这次发送的报文直到对方确认收到之后才会销毁。

  • 连接管理机制:三次握手和四次挥手。三次握手以最小成本确保了双方通信的意愿,快速地验证全双工(代表双方的网络状态畅通);四次挥手之所以没有做捎带应答,是因为存在单方通信的可能, 主动断开连接的一方发送四次挥手,此时被动断开的一方可能还有数据需要向主动方传递,因此才要保证具有单向通信当把数据发送完毕之后再进行关闭。

  • 流量控制:流量控制之所以保证可靠性是因为在发送数据之前就确保我发的数据大小能够被对方的接收缓冲区所接收,避免了因为对方缓存区容量不足而导致的重传问题

  • 拥塞控制:拥塞控制首先通过二的N次方这个函数进行网络的探测, 这一段本质就是慢启动恢复网络的过程;恢复之后开始进行线性探测,开始进行线性探测的那个点就是ssresh。

效率

  • 滑动窗口:属于发送缓冲区的一部分,可以连续发送多个报文,不必等到对端的应答之后再开始发送,这是它效率性的体现.同时我们实际发送的数据大小受到我们滑动窗口以及我们的拥塞窗口两个值的影响,发送的数据是两者之间的最小值。
  • 快速重传机制: 触发条件是收到三个确认序号一样的应答,自动把确认序号对应的那个报文立即重新传递,比如发送了四个报文但是返回了三个完全一样的确认序号应答,说明其中有一个丢包,根据确认序号的定义我们就可以立即找到那个丢包的报文然后立即发送。
  • 延迟应答:接收方收到应答之后不用立马返回响应,可以等待上层应用层把缓冲区的数据取走之后在给响应此时我们更新的滑动窗口的大小就可能会更大从而提高传输的速率。但是不能一直延迟不发,通常是收到两个之后再给一个响应,这个就是我们确认序号体现的价值,我们不用对每一个请求做应答。
  • 捎带应答:捎带应答就是在回复对方的同时携带自己想要发送的数据,三次握手本质上就是因为有了一次捎带应答才变成了三次握手;四次挥手之所以不可以做捎带应答是因为存在可能需要单向通信的情况。

连接管理中的状态:


  • MSL:一个报文在网络中最长的存活时间

  • 理解TIME_WAIT:时间为2Ms L,主动断开连接的一方会有这个状态,在这个状态持续的时间内该端口不可被再次绑定,主要目的是为了防止我们立刻断开连接立刻重连这种情况下,陈旧报文影响到下次新建连接的通信。时间之所以为二倍的MSL是因为确保陈旧报文在来回通信的过程中能够消散。此外当被动断开连接的一方发送lost ACK的时候该报文可能会丢失有了这个时间段我们就可以让被动断开连接的一方再次进行重传,如果没有丢失那就说明四次握手成功。而我们不让对历史端口进行重复绑定就逼迫了,下次新建连接你必须要换端口号此时就规避掉了上次连接的陈旧报文的影响,因为陈旧报文是上次的端口号,对端收到就会把它给丢弃。但是为了快速的恢复连接,提供的有接口可以快速再次建立重连,这个时候防止陈旧报文就是根据序号和确认序号来进行防治的。因为下一次新连接建立的时候会进行序号的商讨和确认序号的商讨,陈旧的报文的序号不一定在这个范围内,如果不在这个范围内直接丢弃。

  • 解决time wait的方法:

  • 当主动关闭方(如客户端)发送第一次挥手(FIN)后,被动关闭方(如服务器)收到该 FIN,就会进入 CLOSE_WAIT 状态,同时回复 ACK。这个状态表示:对方已经关闭连接,但本地应用程序尚未关闭自己的 socket。此时服务器如果一直不关闭socket那么就会造成文件描述符的浪费,此时的状态就处于TCP半关闭状态。

UDP

特点: 不可靠,无连接,面向数据包

大小端字节序

  • 在网络传输的过程中不同的子主机有可能是大端机器也可能是小端机器,但网络协议规定只要是传送到数据上按1GB按到大端进行存放,这也就是为什么我们在进行socket通信的时候我们会通常把主机的port字节序转化为网络字节序;这样无论收发双方主机是大端机器还是小端机器从网络上收到的数据都是按照大端存储的然后后续紧接着把网络字节序转换为主机字节序就可以根据自己的机器进行转化屏蔽上了不同机器的差异。
相关推荐
茶乡浪子2 小时前
Community Filter应用实战
网络·智能路由器
senijusene2 小时前
TCP并发服务器与I/O多路复用(select)
服务器·网络协议·tcp/ip
松果1772 小时前
常见网络攻击技术方法
网络·网络攻击
lichenyang4532 小时前
TCP 与 UDP
网络·tcp/ip·udp
IPDEEP全球代理2 小时前
静态住宅IP安全吗?
网络协议·tcp/ip·安全
AC赳赳老秦2 小时前
2026国产大模型协同趋势:以DeepSeek为枢纽,构建高效智能协作网络
大数据·网络·人工智能·搜索引擎·交互·ai-native·deepseek
天才梦浪2 小时前
wsl的网络导致springboot启动提示端口占用
网络·spring boot·后端
梦白.2 小时前
初始计算机网络
网络·计算机网络
爱丽_2 小时前
博客:Netty 高性能网络编程核心(Reactor / Pipeline / 粘拆包 / ByteBuf / 背压)
网络