TCP的异常终止连接及SO_LINGER选项:
终止一个连接的正常方式是一方发送FIN,进入FIN_WAIT1状态。当我们调用close()
函数关闭连接之后,如果在发送缓冲区中还有数据,那么系统会发送这些数据,然后再发送FIN,但是也有可能发送一个复位报文段来释放一个连接,这种现象就称为异常终止连接。
异常终止一个连接有两个优点:(1.马上丢弃待发送数据并立即发送复位报文段(2.RST的接收方会区分另一端执行的是异常关闭还是正常关闭。
我们可以自己编写sock程序并使用tcpdump工具进行分析查看异常关闭的整个过程(sock代码放在最后)。
- 首先运行
tcpdump "port 6666" -i lo -S
(指定监听的端口,-i参数代表选择监听的网卡,lo是用来进行环回测试的,-S命令是完整的显示序号) - 接下来运行我们编译完成的server端
./server
- 再运行client端
./client
- 这个时候就可以看到运行了
tcpdump
那个终端显示出了三次握手的三个报文 - 再启动一个终端运行
netstat -ano | grep 6666
,查看6666端口的使用情况 ctrl+c
终止任意一端,这时候查看运行了tcpdump
那个终端显示的数据,就会发现多了一行数据,即复位报文段。再次运行netstat -ano | grep 6666
,会发现已经没有进程占用6666端口了。这点和以前不同,正常的终止连接主动关闭方会进入TIME_WAIT
状态&#