传输层TCP

news/2024/10/31 22:38:28/

报头
  


  
1.报头和有效载荷如何分离将,有效载荷向上交付?
tcp有个标准报头长度为20,那是不是以为我们可以像udp一样分离依靠报头大小去分离,我们仔细去看我们报头中还有个选项没包含到。


我们还有个首部长度,四位可以表示1111,最大为15,它要乘以4才能表示报头长度,也就是说报头长度必须是4的倍数,选项大小最大为40字节,所以我们再读取报头时,首先读前20个标准报头长度,再从首部中读取整个报头的长度。

16位窗口大小
  

  
当发送方发了很多数据,把对方的接受缓冲区填满了,但是发送方不知道对方缓冲区满了,发送方还要发,可能就造成了数据泄漏,为了使传输的效率变高,防止数据泄漏,我们就要解决这个问题的关键,就是让发送方知道对方的接受缓冲区被填满,强制停止发送
我们有个策略叫做流量控制,这个策略由tcp协议完成的,也就是说是OS中的tcp模块完成的,tcp协议也叫传输控制协议
所以我们根本不用去考虑接受缓冲区被填满的情况,在文件IO的原理是一样的
如何流量控制
  
  
发送方得知道接收方的接受能力,就是要知道接受方接受缓冲区的剩余空间。

我们在通信的时候不是单发面的发送,服务器接收到消息给客户端确认的消息(ACK)(确认应答机制),我们接收方缓冲区的剩余空间就会被填充到窗口大小,客户端也就知道了要缓慢发送还是停止发送。停止发送也就是说直接让客户端的发送方写满发送缓冲区,就让进程阻塞,直到OS重新给发送,这也就是同步机制


ACK


这个词也许很陌生,但我们在通信时就是发送报头+数据ACK肯定也是一种报文.
它的作用:是确认应答,表示接收方已经成功接收到某个数据段。
tcp保持可靠性
如果有应答,对于发送方,能保证上面的消息全部接受到。


关于确认应答和tcp数据发送模式

Tcp发送数据的方式
1.串型发送 一条一条发 (理解)
  
  
2.并行发送(常见)
发送时间,进行重叠,同一时刻发送多条报文
  
  
保证数据按序到达?
server收到的报文可能是乱序的,他是不可靠的——报文按序到达,依靠报头中的32位序号解决,32位序号,根据序号进行排序
服务端发送ACK也要一对一的回应给客户端那些报文被收到了,此时由32位确认序号保证,例如32位序号为100的报文的ACK中确认序号为101,确认序号之前的所有报文已经被收到,这样的设计有一个好处,就是允许了少量的ACK丢失。
既然有了32位序号,为什么又要有确认序号呢,他们两的值不能是一样的吗?
捎带应答,是指它既对报文进行了应答的同时又捎带了数据,为了防止乱序,就要填充自己的32为序号,又要给对方确认应答,所以又要填充自己的32位确认序号
由此可见:tcp保证可靠性,但不仅仅可靠性,还积极的提高了效率

标记位

server一定会接收到各种不同的报文

例如:三次握手syn,四次挥手fin

此时就得引入标记位
例如如果是syn报文,syn的标记位置为一

16位紧急指针

URG


标志位为URG
urg指针标记为一,当发送紧急报文时,紧急报文也得排队,但是需要尽快处理,所以得让它插队,紧急报文会携带紧急数据,而紧急指针表示的是数据的偏移量,接收方会优先去依靠紧急指针提供的便宜量查看数据中的紧急数据,
值得一提的是:紧急指针只存在1个字节

紧急指针有怎么使用呢?标识紧急任务,当上传任务可能上错了想要让他暂停,就把紧急数据变为1,让他赶紧暂停上传任务

psh


当我们的接收缓冲区满了之后,发送方会定时发送询问报文,而我们的接受方同时也会发送一个窗口大小更新报文。
询问报文:就是把psh标记为一,让服务器赶紧把数据向上层交付
psh不仅仅只在这种情况下使用,在任何需要让接收方尽快将数据进行上层交付的情景都可以使用
例如:我们在输入指令的时候,通常都是发送push的报文,让接收方尽快对报文进行解释

reset
tcp是保证可靠性的,那么三次握手是不是必须成功,错误的
我们的可靠性指的是我们发送消息,对方能确认收到,我们发的消息丢失对方收不到,对方也能知道对方没收到,这才叫可靠性。

在建立通信,三次握手中,第一次客户端syn发送出错时,我们是知道的,因为没有收到服务器的syn+ack,第二次客户端syn+ack发送出错时,我们也是知道的,因为此时连接没有建立好,当第三次ack发送时,因为它是最新的一条消息,他是没有应答的,我们不知道它到底发没发送成功,当客户端发送第三次握手ack时,服务端没收到,此时客户端是知道自己建立好了连接,但是服务端是不知道的,这叫建立连接认知不一致。


在此时,客户端不知道服务端没收到ack,客户端以为建立好了连接,接下来发送消息,服务器此时不知道建立好了连接,就会发送一个reset报文,告知客户端重新建立连接
  
  
  
建立连接认知不一致
,不一定是服务端不知道是否建立连接,网络传输的过程是非常复杂的,当服务器和客户端正常通信的时候,此时拔了客户端的网线,客户端知道了断开了连接,但是服务器是不知道的,此时客户端就需要发出reset报文了。


http://www.ppmy.cn/news/1543424.html

相关文章

[Linux关键词]unmask,mv,dev/pts,stdin stdout stderr,echo

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

Java审计对比工具JaVers使用

最近有个需求,需要将页面的内容生成excel或者word文档,而且每次的修改都需要生成新的版本,同时需要记录每次修改变化的内容。我们会把每次的修改的内容提交赋值给一个java对象,同时存储到数据库一条新数据,对应数据表一…

物联网海量数据下的时序数据库选型:InfluxDB、TDEngine、MongoDB与HBase对比与建议

随着物联网(IoT)的普及,各行业纷纷部署大量传感器、设备生成的数据流,面对如此海量的时间序列数据,如何高效存储、查询和分析成为关键。为此,时序数据库(Time Series Database, TSDB&#xff09…

设计模式 - 单例模式(懒汉式、饿汉式、静态内部类、枚举)

目录 一、单例模式的核心概念 二、实现单例模式的方法 2.1 懒汉式(Lazy Initialization) 2.1.1 线程不安全版本 2.1.2 双重检查锁定(线程安全) 2.2 饿汉式(Eager Initialization) 2.3 静态内部类&am…

【Windows11】24H2 内存占用高(截至10月31日)

文章目录 一、问题二、解决三、原因 一、问题 系统版本: 内存只有32GB。 以前只有我在运行数据处理程序的时候内存占用才会很高,日常情况下应该只有40%、50%左右的。 但是24H2,日常情况下内存占用80%以上。 而我只开了很少的应用&#…

ORACLE 11G WINDOWS上面搭建DG,路径对应不起作用

问题现象: 今天在WINDOWS上搭建ORACLE DG时,主备库路径不一样, 比如 主库为:d:\oradata\orcl\ 备库为:e:\oradata\orcl\ 于是在备库的参数中,加了以下参数: db_file_name_convertd:\oradata\o…

计算机网络:网络层 —— IP 协议概述

文章目录 IP 协议概述异构网络互连IP 地址IPv4IPv6 IP 协议概述 网际协议(Internet Protocol,IP)是 TCP/IP 体系结构网际层中的核心协议,也是构成互联网的基础。 IP 协议是一种用于在计算机网络中传输数据的协议,是 TCP/IP 协议组中的网络层…

es(1)(仅供自己参考)

elasticsearch(ES)是一款非常强大的开源搜索引擎,可以帮助我们从海量的数据中快速找到需要的内容。 elastic stack(ELK):elasticsearch结合kibana、Logstash、Beats。被广泛的应用在日志数据分析、实时监控…