18.7.2 异常终止一个连接

18.7.2  异常终止一个连接

我们终止一个连接的正常方式是一方发送FIN。

  s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
                         struct.pack('ii', 1, 0))



我们加上 - L选项并将停留时间设为 0。这将导
致连接关闭时进行复位而不是正常的 F I N。


SO_LINGER套接口选项

A、l_onoff设置为0,这也是默认情况,函数close()是立即返回的,然后TCP连接双方是通过FIN、ACK4分组来终止TCP连接的。当然,发送缓冲区还有数据的话,系统将试着将这些数据发送到对方。

B、l_onoff非0,l_linger设置0,函数close()立即返回,并发送RST终止连接,发送缓冲区的数据丢弃。

C、l_onoff非0,l_linger非0,函数close()不立即返回,而是在

(a)发送缓冲区数据发送完并得到确认

(b)l_linger延迟时间到,l_linger时间单位为微妙。

两者之一成立时返回。如果在发送缓冲区数据发送完并被确认前延迟时间到的话,close返回EWOULDBLOCK(或EAGAIN)错误。

(2)python的tcp客户端将采用B方式发送rst报文:

#设置l_onoff非0,l_linger设置0

s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,struct.pack('ii', 1, 0))


  选项             间隔    关闭方式  等待关闭与否
  SO_DONTLINGER   不关心     优雅         否
  SO_LINGER        零        强制         否
  SO_LINGER       非零       优雅         是
  
  


正常的TCP的创建和关闭:
node2:/root# tcpdump -i eth1 '((tcp) and ((tcp port 8080) and (  host 192.168.137.2)))'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
16:15:20.896174 IP node2.19385 > node1.webcache: Flags [S], seq 3639452141, win 14600, options [mss 1460,sackOK,TS val 115273332 ecr 0,nop,wscale 7], length 0
16:15:20.896434 IP node1.webcache > node2.19385: Flags [S.], seq 2009894825, ack 3639452142, win 14480, options [mss 1460,sackOK,TS val 11179063 ecr 115273332,nop,wscale 6], length 0
16:15:20.896449 IP node2.19385 > node1.webcache: Flags [.], ack 1, win 115, options [nop,nop,TS val 115273333 ecr 11179063], length 0

16:15:20.896509 IP node2.19385 > node1.webcache: Flags [F.], seq 1, ack 1, win 115, options [nop,nop,TS val 115273333 ecr 11179063], length 0
16:15:20.896780 IP node1.webcache > node2.19385: Flags [F.], seq 1, ack 2, win 227, options [nop,nop,TS val 11179063 ecr 115273333], length 0
16:15:20.896791 IP node2.19385 > node1.webcache: Flags [.], ack 2, win 115, options [nop,nop,TS val 115273333 ecr 11179063], length 0



node2:/root/test#cat t3.py 
import socket
import time
import struct
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,struct.pack('ii', 1, 0))

s.connect(("192.168.137.2",8080))
s.close()


node2:/root# tcpdump -i eth1 '((tcp) and ((tcp port 8080) and (  host 192.168.137.2)))'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
16:29:47.112004 IP node2.19386 > node1.webcache: Flags [S], seq 2370997704, win 14600, options [mss 1460,sackOK,TS val 116139547 ecr 0,nop,wscale 7], length 0
16:29:47.112240 IP node1.webcache > node2.19386: Flags [S.], seq 145220668, ack 2370997705, win 14480, options [mss 1460,sackOK,TS val 12045277 ecr 116139547,nop,wscale 6], length 0
16:29:47.112479 IP node2.19386 > node1.webcache: Flags [.], ack 1, win 115, options [nop,nop,TS val 116139549 ecr 12045277], length 0

16:29:47.112634 IP node2.19386 > node1.webcache: Flags [R.], seq 1, ack 1, win 115, options [nop,nop,TS val 116139549 ecr 12045277], length 0
原文地址:https://www.cnblogs.com/hzcya1995/p/13348555.html