【网络】传输层协议TCP(中)

news/2024/10/31 22:42:39/

目录

四次挥手状态变化

流量控制

PSH标记位

URG标记位


四次挥手状态变化

之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手,下面是四次挥手的状态变化

那么我们下面可以来验证一下CLOSE_WAIT这个状态,这个状态出现的条件是后调用close的一方(比如服务器)调用close之前(调用完close就进入last_ack),我们可以很容易模拟出来,直接比如让客户端先调用close,不让服务器端调用close即可,这样就可以看到这个状态

用指令netstat -natp,a表示all

这就证明一件事情,如果我们发现服务器上有大量close_wait状态的时候,这就意味着大概率我们写的服务器有BUG,主要是没有close fd

我们把服务器进程关掉就看不到这个状态了,因为进程结束会把所有文件描述符释放掉

我们可以看到图中有一个time_wait的状态,对这个就是等待一段时间,这个状态实际上是先调用close的一方收到对方的close并给应答后处于的一种状态,这个状态通常持续的时间是分钟级别的,所以我们也可以较容易的看到

这样虽然服务器进程已经关闭,但是这里的端口仍然是被占用的,这也就是为什么立即启动服务器会bind err

所以我们的处理方法就是设置地址复用

那么等待的时间是多少呢?

TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待两个MSL的时间才能回到CLOSED状态

MSL是 Maximum Segment Lifetime(报文在网络中最大存活时间),我们可以看Linux中它是多长

也就是一分钟,所以TIME_WAIT的时间就是两分钟

下面解释一下为什么会等待这么长的时间

1.因为有可能我关闭了服务器后立马又绑定相同的IP和端口,这是其实是发给上一次连接的数据由于阻塞在了网络中一段时间,现在发到了服务器,这样旧报文就会影响新连接

2.或者说,四次挥手的最后一次ACK可能会丢,如果等待了2个MSL,对方没收到ACK就会超时重传,这是处于TIME_WAIT的我们就可以重新发ACK。总之,就是又重传的机会,保证让对方也关闭连接。

流量控制

有下面这样一种场景,如果A给B发消息非常快,导致B的缓冲区被打满了,那么新来的数据就会被丢弃,尽管TCP有超时重传机制,但是这样其实是不合理的,因为发送的数据被丢掉就会白白占用网络资源;不仅如此如果A发送的过于慢,这也会导致效率低下。

这上面的问题就和我们要说的流量控制有关,B可以通过应答ACK报文通告给A自己缓冲区剩余空间的大小,那么A就可以选择加快或减慢发送的速度

这里就是B就是通过报头中的16位窗口大小将自己缓冲区的大小通告给A的

那如果B的缓冲区满了,A和B就不进行数据交互了,那么A是如何知道B什么时候有空间呢?

A会向B发送窗口探测,B会向A发送窗口更新通知,这两种机制是会同时存在的。

PSH标记位

那如果B一直没空间,A就会给B发的报头中把PSH标记位 置一(当然PSH标记位的应用场景不只是会这么极端),就是让B尽快向上交付,当然取走缓冲区中的数据取决于应用层,这里的意思是应用层调用read的时候不要阻塞,即使要读走的内容很少,也要尽量读走

URG标记位

这个标记位 置一是指16位紧急指针有效,16位紧急指针中存着紧急数据在报文数据中的偏移量(广义的指针就是指能找到想要的数据即可),这个紧急数据一般是一个字节,通常是上层应用层规定好的。

这个大概的应用场景是:比如客户端要给服务器上传数据,上传到一半不想上传了,但是此时服务器TCP缓冲区中还有很多数据,这些数据其实都不想上传了,有了紧急指针就可以不按序到达,TCP协议可以让上层先把带有紧急指针的报文读上去,这样就可以停止上传了


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

相关文章

传输层TCP

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

[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 协议组中的网络层…