配置:
本地IP:192.168.1.45
服务端监听端口 12345
操作步骤:
准备客户端、服务端代码
# server.py
import socket
import logging
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def handle_client(conn, addr):
logging.info(f"Connected by {addr}")
# try:
# 这里可以添加与客户端交互的代码
while True:
data = conn.recv(1024)
if not data:
break
# 处理数据...
# conn.sendall(data) # 回显数据作为示例
# finally:
# logging.info(f"Disconnected by {addr}")
# conn.close()
def main():
host = '192.168.1.45'
port = 12345
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((host, port))
s.listen()
logging.info(f"Server is listening on {host}:{port}")
while True:
conn, addr = s.accept()
with conn:
# 创建一个新线程来处理连接(在生产环境中应使用线程池或异步IO)
# 这里为了简化,直接在主线程中处理
handle_client(conn, addr)
if __name__ == '__main__':
main()
# client.py
import socket
def main():
host = '192.168.1.45'
port = 12345
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
try:
message = "abcdefghijklmn".encode('utf-8')
s.sendall(message)
# data = s.recv(1024)
# print('Received', repr(data))
finally:
s.close()
if __name__ == '__main__':
main()
启动server监听
python server.py
添加过滤条件,启动wireshark监听,过滤条件为
(ip.src_host eq 192.168.1.45) and (tcp.srcport eq 12345) and tcp.flags.syn==1 and tcp.flags.ack == 1
解释数据包过滤:发送源地址为192.168.1.45 而且发送源端口为12345而且是tcp协议而且tcp协议的flags中同时设置了syn和ack两个flag。
依据数据包内容如:
个人理解:因为tcp三次握手,就是客户端和服务端直接总共发送了三次tcp数据包嘛(c先给s发一次请求包(syn),s再给c发一次确认包syn+ack,c再给s发一次确认包(ack标识) ),所以我觉得只需要过滤出第二次握手包就基本可以认为能建立正常tcp连接了。
这样基本就可以通过在服务端抓包监控服务端的tcp连接数了吧。。。。。。
和命令查询比较
Administrator@fu-wanglei MINGW64 /
$ netstat -an | findstr 12345 | nl
1 TCP 192.168.1.45:12345 0.0.0.0:0 LISTENING
2 TCP 192.168.1.45:59475 192.168.1.45:12345 TIME_WAIT
3 TCP 192.168.1.45:59587 192.168.1.45:12345 TIME_WAIT
4 TCP 192.168.1.45:59593 192.168.1.45:12345 TIME_WAIT
这个命令查出来的短时间内建立过的tcp连接,wireshark监控是获取从开始监听的时间点到现在的总得tcp确认连接包列表。
关于time_wait
在TCP/IP协议中,TIME_WAIT状态是一个重要的部分,用于确保在网络中传输的数据包能够被正确接收和处理,同时避免旧连接的延迟数据(或“迷途”数据包)干扰到新建立的连接。然而,在某些高负载或资源受限的场景下,TIME_WAIT状态可能会占用大量的系统资源(如端口号),导致新连接无法立即建立。
TCP TIME_WAIT 状态
当一个TCP连接被关闭时,主动关闭连接的一方(通常是客户端)会进入TIME_WAIT状态。这个状态会持续一段时间(通常是2倍的MSL,即最大报文段生存时间,通常为2分钟),以确保网络中所有的TCP报文段都已经被处理完毕。
TIME_WAIT 复用
虽然TIME_WAIT状态对于TCP的健壮性至关重要,但在某些情况下,你可能希望复用处于TIME_WAIT状态的端口来建立新的连接。不幸的是,标准的TCP协议并不直接支持TIME_WAIT状态的端口复用。但是,有几种方法可以在一定程度上绕过这个限制,但是不建议修改。
============================================================
time_wait实际操作
服务端终端:
客户端终端:
time_wait是可以修改的
服务端不建议主动关闭tcp连接