11.TCP04_释放连接

TCP—释放连接—4次挥手

释放连接是建立在建立连接的基础上,由客户端发起的连接释放,ACK为1,因为在前面客户端与服务器有进行过数据的转发

在这里插入图片描述

TCP—释放连接—状态解读

◼ FIN-WAIT-1:表示想主动关闭连接

向对方发送了FIN报文,此时进入到FIN-WAIT-1状态

◼ CLOSE-WAIT:表示在等待关闭

当对方发送FIN给自己,自己会回应一个ACK报文给对方,此时则进入到CLOSE-WAIT状态

在此状态下,需要考虑自己是否还有数据要发送给对方,如果没有,发送FIN报文给对方

◼ FIN-WAIT-2:只要对方发送ACK确认后,主动方就会处于FIN-WAIT-2状态,然后等待对方发送FIN报文

◼ CLOSING:一种比较罕见的例外状态

表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文

如果双方几乎在同时准备关闭连接的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态

表示双方都正在关闭连接(主动就会出现CLOSING)

◼ LAST-ACK:被动关闭一方在发送FIN报文后,最后等待对方的ACK报文

当收到ACK报文后,即可进入CLOSED状态了

◼ TIME-WAIT:表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可进入CLOSED状态了

如果FIN-WAIT-1状态下,收到了对方同时带FIN标志和ACK标志的报文时

✓ 可以直接进入到TIME-WAIT状态,而无须经过FIN-WAIT-2状态

◼ CLOSED:关闭状态

◼ 由于有些状态的时间比较短暂,所以很难用netstat命令看到,比如SYN-RCVD、FIN-WAIT-1等

在这里插入图片描述

(netstat -n)

TCP—释放连接—细节

◼ TCP/IP协议栈在设计上,允许任何一方先发起断开请求。这里演示的是client主动要求断开

◼ client发送ACK后,需要有个TIME-WAIT阶段,等待一段时间后,再真正关闭连接

一般是等待2倍的MSL(Maximum Segment Lifetime,最大分段生存期)

✓ MSL是TCP报文在Internet上的最长生存时间

✓ 每个具体的TCP实现都必须选择一个确定的MSL值,RFC 1122建议是2分钟

✓ 可以防止本次连接中产生的数据包误传到下一次连接中(因为本次连接中的数据包都会在2MSL时间内消失了)

◼ 如果client发送ACK后马上释放了,然后又因为网络原因,server没有收到client的ACK,server按照传统就会重发FIN

这时可能出现的情况是

① client没有任何响应,服务器那边会干等,甚至多次重发FIN,浪费资源

② client有个新的应用程序刚好分配了同一个端口号,新的应用程序收到FIN后马上开始执行断开连接的操作,本来它可能是想跟server建立连接的

服务器根据对方的IP地址的端口号进行数据发送,给对应的软件

端口都是随机分配的,除了一些特殊的程序,它固定分配某些端口

socket:一套网络编程的API

强制杀掉,如果没走close,就会走RST,主要看我们的代码怎么写的

在这里插入图片描述

当绿点亮起来的时候,代表程序在运行了

在这里插入图片描述

tcp.port == 8888

锁定协议、端口号

在这里插入图片描述

数据部分:数据长度的值+数据内容

wireshark只是把拿到的字节根据ASCII码转换成英文字母,在ASCII表里没有找到的,就用点了

汉字和UTF-8是应用层的东西,wirshark没有你想的这么智能

在这里插入图片描述

客户端发送FIN,因为服务器没有写关闭连接的功能,所以我们只看到了三次,最后一次服务器强制关闭,这是因为服务器端的代码没有写好。

如果客户端强制关闭,会给服务器发送一条数据,RST(异常断开,强制杀死)

在这里插入图片描述

四次挥手看的清清楚楚

前两次是客户端要求结束关系,但是这不影响服务器后面发送数据给客户端,客户端进行确认

后两次是服务器要求结束关系,这次就是真的结束关系了

连接就是跟服务器进行数据的交互

连接只是一种状态,双方准备好随时交互

长连接:一直保持着连接状态,可以连续多次的发送数据,多次交互,由你来决定什么时候释放

短连接:发一次,断一次(做完一次交互,就断开连接)

TCP—释放连接—疑问

◼ 为什么释放连接的时候,要进行4次挥手?

TCP是全双工模式,通信是双方的

第1次挥手:当主机1发出FIN报文段时

✓ 表示主机1告诉主机2,主机1已经没有数据要发送了,但是,此时主机1还是可以接受来自主机2的数据

做出承诺,不会再给你发数据了

第2次挥手:当主机2返回ACK报文段时

✓ 表示主机2已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的

经历两次挥手,仅仅只是关闭了,主机1发送给主机2的数据通道,主机2仍然还是可以给主机1发送数据

第3次挥手:当主机2也发送了FIN报文段时

✓ 表示主机2告诉主机1,主机2已经没有数据要发送了

做出承诺,我以后也不会再发数据给你了

第4次挥手:当主机1返回ACK报文段时

✓ 表示主机1已经知道主机2没有数据发送了。随后正式断开整个TCP连接

知道了,主机2不会再发数据过来了,主机1不会在去等待了

关掉了,主机2发送给主机1的数据通道

两边通道全关掉,才会进入CLOSED状态

保活和心跳包是什么

有的服务器在应用层加了一套程序(定时器),在建立连接后,15秒内,没有接收到客户端发送过来的数据,就会发送FIN断开连接,但是客户端却想建立长连接,便会进行连接保活,每隔一段时间发送数据包告诉服务器,例如每隔5秒,发一个数据包,我还活着,你不要把连接断了,这样子服务器就知道你还在,就会为你保持这个连接(重置定时器)

这是应用层方面的保活,按照默认的长连接,对服务器的资源存在浪费

传输层也有,但是一般我们自己实现,这样子比较灵活,TCP的keep-alive(跟HTTP不一样),可以设置时长,心跳包

这是为了优化服务器的性能,不使资源白白浪费,因为有时候客户端真的会因为某一些原因,而不在了,但服务器却白白的在等,这就是对服务器资源的浪费

wireshark,Ctrl+f查找特定分组

TCP—释放连接—抓包

在这里插入图片描述

(四次挥手)

在这里插入图片描述

(三次挥手)

◼ 有时候在使用抓包工具的时候,有可能只会看到“3次“挥手

这其实是将第2、3次挥手合并了

◼ 当server接收到client的FIN时,如果server后面也没有数据要发送给client了

在这里插入图片描述

这时,server就可以将第2、3次挥手合并,同时告诉client两件事(如果你也想关闭了,那就直接说)

✓ 已经知道client没有数据要发

✓ server已经没有数据要发了

在这里插入图片描述

建立完连接之后,不断开连接,对网卡是没有影响的,网卡是用来收发数据的,对传过来的数据包进行过滤,判断是不是给自己的,如果是的话就进行接收,传给网络层。

网卡带宽越高,传输速率就越快(百兆网卡,千兆网卡),数据太多,带宽处理不过来,缓冲区满了,就会把它扔掉

数据链路层有一个缓冲区,数据上来,先往缓冲区放,满了。就会把它丢掉

网卡工作在数据链路层,因为要检查数据包,就说明数据已经到了数据链路层

要建立连接,双方底层会创建一个socket对象,在软件(编码)层面,两个socket对象进行交互

不断开连接是对内存有影响,因为要一直运行着socket

在这里插入图片描述

一个客户端跟服务器关闭连接,跟其他客户端与服务器的连接,没有半毛钱关系

猜你喜欢

转载自blog.csdn.net/m0_53008479/article/details/120803831
今日推荐