本文已参与[新人创作礼]活动,一起开启掘金创作之路
python socket 编程实验
实验主要就是用python写一对TCP服务器/客户端,再写一对UDP服务器/客户端,然后用抓包工具Wireshark和RawCap分别抓取他们的通讯过程,然后分析。
TCP:
Server:
import socket
def main():
ip_port = (('127.0.0.1', 1000))
sk = socket.socket()
sk.bind(ip_port)
sk.listen(5)
print('server waiting...')
conn, addr = sk.accept()
print('连接成功,客户端为:')
print(addr)
while True:
client_data = conn.recv(1024)
print('客户端传来的数据是:' + client_data.decode('utf-8'))
if client_data.decode('utf-8') == 'q':
break
msg = '客户端你好,我是服务器'
conn.sendall(msg.encode('utf-8'))
conn.close()
sk.close()
if __name__ == '__main__':
main()
Client:
import socket
def main():
ip_port = (('127.0.0.1', 1000))
sk = socket.socket()
sk.connect(ip_port)
while True:
msg = input('请输入:')
sk.sendall(msg.encode('utf-8'))
server_reply = sk.recv(1024)
if not server_reply:
break
print(server_reply.decode('utf-8'))
sk.close()
if __name__ == '__main__':
main()
因为是抓本地回环数据,所以要先用RawCap抓,然后用Wireshark打开抓到的文件解析。
首先在cmd中进入RawCap所在的文件夹中
然后在这里运行RawCap,接着运行服务器,再然后是客户端,这样才能抓到交互数据
抓取停止的时候要用Ctrl+C停止,然后在RawCap.exe同级目录下就会出现抓到的数据文件TCP.dump.pcap,用Wireshark打开这个文件(一般直接点击打开就行)就可以进行解析了。
找到对应的分组后(我是一组一组找的)
通讯内容(分析→追踪流→TCP流):
三次握手:
第一次:
第二次:
第三次:
源端口(Source Port)和目的端口(Destination Port):
TTL值:
IP版本号:
协议类型:
IP头长度:
传输的数据内容(其中之一):
UDP
Sever:
import socket
def main():
ip_port = (('127.0.0.1', 1000))
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(ip_port)
print('等待。。。')
while True:
data, address = s.recvfrom(1024)
print(data.decode('utf-8'), address)
if data.decode('utf-8') == 'q':
s.sendto('q'.encode('utf-8'), address)
break
msg = '你好UDP客户端,这里是UDP服务端'
s.sendto(msg.encode('utf-8'), address)
s.close()
if __name__ == '__main__':
main()
Client:
import socket
def main():
ip_port = (('127.0.0.1', 1000))
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addr = ip_port
while True:
message = input('请输入:')
s.sendto(message.encode('utf-8'), addr)
data, addr = s.recvfrom(1024)
if data.decode('utf-8') == 'q':
break
print(data.decode('utf-8'), addr)
s.close()
if __name__ == '__main__':
main()
抓包过程同TCP
内容:
源端口和目的端口:
TTL值:
IP版本号:
协议类型:
IP头长度:
传输的数据内容: