深入理解TCP网络协议(2)

目录

1.TCP的状态转换

[1.1 LISTEN状态和ETABLISHED状态](#1.1 LISTEN状态和ETABLISHED状态)

[​编辑2.TIME_WAIT 和 CLOSE_WAIT](#编辑2.TIME_WAIT 和 CLOSE_WAIT)

2.滑动窗口


1.TCP的状态转换

我们通过上图可以看到TCP状态转换的详细过程.在实际开发的过程中,我们不需要了解的这么细致.为了方便大家的理解,我挑几个主要的状态来给大家聊一下

1.1 LISTEN状态和ETABLISHED状态

我们可以通过命令行 netstat -ano | findstr 10111

表示查询端口号为10111的服务器状态 注:此时我们仅仅是将服务器启动了,并没有做别的操作

可以看到有一个LISTENING的服务器状态(Windows操作系统上是这样,但是到了Linux操作系统上就是我们说的LISTEN状态了),该状态的意思是服务器已经启动就绪(即创建好了SeverSocket对象,并且绑定好了端口号),客户端可以给它发送请求了,这就好比开了一个饭店,早上起来把门打开,告诉路过的客人,我们这个饭店已经开门了,欢迎随时来吃饭.

接下来我们来观察一下

ESTABLISHED这个状态,这个状态的意思是已经有客户端和该服务器完成了三次握手创建链接的了

即可以向这个服务器发送请求了

我们接着输入 netstat - ano | findstr 10111 来观察一下

2.TIME_WAIT 和 CLOSE_WAIT

CLOSE_WAIT表示,在接下来的代码中需要调用close来主动发起fin 收到对方的fin之后进入这个状态.通俗易懂的说,就是加入客户端要向服务器发起fin,断开连接,服务器立马回了一个ack,并且进入到

对端给我发送了一个fin以后,我需要主动也调用close,这个时候的状态就是CLOSE_WAIT状态.属于一种被动的状态.

而TIME_WAIT则表示本端给对方发起FIN之后,对端业给我发FIN,此时本端进入TIME_WAIT.给最后一个ACK重传留有一定的时间.

即谁主动断开连接,谁进入TIME_WAIT状态.

一般情况下,不太容易观察到CLOSE_WAIT状态,待会会比较快速的关闭socket,状态就会从CLOSE_WAIT->LAST_ACK

如果发现服务器有大量的CLOSE_WAIT就意味着代码有bug,如忘记关socket

TIME_WAIT状态.更容易观察到.它存在的意义是为了防止最后一个ack丢包

2.滑动窗口

滑动窗口机制是TCP协议中很有意思的一种机制,它的作用主要是为了提升传输效率,据我们前面所讲的,TCP协议中每次传输数据都会等待对端发送一个ack报文以后才会继续重传下一份,但是这样的效率会很低,不利于我们传输大量的数据.所以前辈们设计了滑动窗口机制.主要的机制是,我们发送端可以一次发送多个数据,然后等待一份ack即可,等到了以后继续发送,这样可以将传输效率大大提高了, 我们用一张图来生动形象的描述一下滑动窗口的过程.

这就是滑动窗口,属于一种批量传输,之前我们是发送一个数据等一下ack然后在发下一条数据.,

而现在则是发送一波数据以后,统一等一波ack,把多次请求的时间统一成一份时间来等.

虽然这种方式提高了传输效率,但是TCP协议的一大特性就是可靠传输,那么滑动窗口这种特性该如何保证可靠传输呢?

我们分为两种情况来看

第一种.ack丢了,这种方式其实并不影响我们的可靠传输,只要后续有ack传过来就行,比如我们2001这份ack丢了,但是后面传来了3001这个ack,就说明3000之前的所有数据都是完整的到了接收方了,此时发送方接着发就行,

这对于可靠性没有影响,也不需要重传.

如上图所示,虽然1001和2001都丢了,但是3001顺利反馈过去了,此时发送方就明白了.我们3001前面的数据都没问题,就不需要重传了.

2.数据丢了 (这种就得重传了)

如上图锁是,我们的1001-2000丢了以后,接收方就会一直重复的发送1001这个ack,告诉我们应该要以1001作为首个字节来发送,当窗口大小到了极限时,就会发送1001,此时会受到7001,就会告诉我们7001之前的数据都没问题,所以可以继续发送了.

相关推荐
草莓熊Lotso1 天前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
XR1234567881 天前
汽车制造园区网络怎么建?柔性产线与 AGV 的选型逻辑
网络·汽车·制造
IT大白鼠1 天前
MSF二次开发与自定义模块编写
网络·安全·web安全·msf
Julien20041 天前
调查和解决 SELinux 问题
linux·运维·服务器·网络·学习方法
kekekzt1 天前
TCP协议的粘包问题介绍,IP分片,MTU,MSS,滑动窗口的概念及之间的关系
网络·网络协议·tcp/ip
mooooooooooye2 天前
2026 年跨平台 SSH 客户端怎么选?Xterminal、Termius、MobaXterm 谁更合适
服务器·网络·ssh
Blockchina2 天前
Codex 实战:从一句需求到可验收的 Linux 主机巡检脚本
运维·服务器·网络
江安下小雨2 天前
muduo网络库(十六):新增连接池模块
网络·c++
aiot189189352182 天前
机场候机大厅高空场景技术红线!蓝牙AOA不能做手机导航??!!
大数据·网络·人工智能·蓝牙aoa
从入门到退休2 天前
企业远程控制选型:向日葵SDK vs RustDesk自建,谁是更务实的选择?
运维·服务器·网络·远程工作·远程控制