zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Nginx进程信号管理
    Nginx配置缓存服务器
    访问Nginx显示目录
    kubeadm快速安装k8s
    《构建之法》读书笔记(一)
    Android Studio连接SQLite数据库与SQLite Studio实时同步的实现
    关于sqlite数据库与sqlite studio
    AS之去掉顶部标题栏
    今日学习
    AS之AlertDialog使用
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13348555.html
Copyright © 2011-2022 走看看