赞
踩
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
一个客户端跟服务器关闭连接,跟其他客户端与服务器的连接,没有半毛钱关系
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。