探索协议栈和网卡——从服务器断开并删除套接字

1、数据发送完毕后断开连接:

数据发送完毕的一方会发起断开过程,但不同的应用程序会选择不同的断开时机。以Web为例,服务器一方会发起断开过程(这里指的是HTTP 1.0 的情形,在HTTP 1.1 中,服务器返回响应消息之后,客户端还可以继续发起在一个请求消息,如果接下来没有请求发送了,客户端一方会发起断开过程)。协议栈在设计上允许任何一方发起断开过程。

以服务器一方发起断开过程为例。首先,服务器一方的应用程序会调用Socket库的close程序。然后,服务器的协议栈会生成包含断开信息的TCP头部,具体来说就是控制位中的FIN比特设为1。接下来,协议栈会委托IP模块向客户端发送数据,同时,服务器的套接字中也会记录下断开操作的相关信息。

当客户端收到FIN为1的TCP头部时,客户端的协议栈将自己的套接字标记为进入断开操作状态。然后客户端会向服务器返回一个ACK号。这些操作完成之后,协议栈就可以等待应用程序来取数据了(应用程序也有可能在收到FIN为1的包之前就来读取数据,这时读取数据的操作会被挂起,等到FIN包到达再继续执行)。在read之后客户端应用程序会调用close来结束数据收发操作,这时客户端的协议栈也会和服务器一样,生成一个FIN比特为1的TCP包,然后委托IP模块发送给服务器。一段时间后,服务器就会返回ACK号。到这里,客户端和服务器的通信就全部结束了。

2、删除套接字:

通信完成之后,用来通信的套接字也就不会再使用了,这时就可以删除这个套接字了。不过,套接字并不会立即被删除,而是会等待一段时间之后再被删除。

等待的这段时间是为了防止误操作。例如最后客户端返回的ACK号丢失了,服务器就需要根据套接字进行重发FIN,如果套接字被删除了,那么重发操作就无法执行;或者删除完后重新又创建的套接字与删除的套接字重合了,那么FIN就会错误地跑到新套接字里面,新套接字就开始执行断开操作了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值