18.5 TCP的半关闭

18.5 TCP的半关闭

TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

这就是所谓的半关闭,


我已经完成了数据传送,因此发送一个文件的结束(FIN)给另一端,

但我还想接收另一端发来的数据,直到他给我发来文件结束(FIN)


shutdown可以指定在某个方向上终止连接,通过指定标志:SHUT_RD, SHUT_WR, SHUT_RDWR。比如指定SHUT_WR后可以继续读数据,但不能写入了。而close是两个方向上终止连接。

close会将描述符的引用计数减一,如果引用计数变为0就关闭描述符,发送FIN。而shutdown不管引用计数,直接发送FIN终止连接。所以在多线程下操作同一个socket描述符下,一个线程调用shutdown会使其他线程无法使用这个描述符,而调用close就不会影响到其他线程。


shutdown()的调用是需要一个参数:0代表禁止下次的数据读取;1代表禁止下次的数据写入;2代表禁止下次的数据读取和写入。

如果应用程序不调用c l o s e而调用s h u t d o w n,且第2个参数值为1,则插口的A P I支持
半关闭。然而,大多数的应用程序通过调用close终止两个方向的连接。


node2:/root#tcpdump -S -i lo dst port not 22 and dst port not 61326

wireshark:

import socket
import time

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.137.2",8080))
s.sendall("this is shutdown test" + "\r\n")
s.send("this is shutdown test")
s.shutdown(socket.SHUT_RDWR)
print(socket.SHUT_RDWR)
print(socket.SHUT_RD)
print(socket.SHUT_WR)
time.sleep(10)
s.shutdown(1)
time.sleep(100)


C:\Users\TLCB>netstat -na | findstr 8080
  TCP    192.168.137.1:53276    192.168.137.2:8080     FIN_WAIT_2



node1:/root#netstat -na | grep 137.1 | grep 8080
tcp        1      0 192.168.137.2:8080          192.168.137.1:53276         CLOSE_WAIT  




发布了3776 篇原创文章 · 获赞 113 · 访问量 349万+

猜你喜欢

转载自blog.csdn.net/zhaoyangjian724/article/details/104388023