📅  最后修改于: 2023-12-03 15:20:47.414000             🧑  作者: Mango
UDP(User Datagram Protocol)和TCP(Transmission Control Protocol)是Internet协议族中最基础的两个协议。
UDP是一个无连接的、不可靠的数据报协议,它只是简单地将数据报文从一个端到另一个端传输,没有数据确认、重传、拥塞控制等机制。
TCP是一个基于连接的、可靠的数据流协议,它提供数据确认、重传、拥塞控制等机制,确保数据可靠地传输。
UDP数据包格式:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TCP数据包格式:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
UDP:
TCP:
UDP:
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serversocket.bind(('localhost', 8080))
while True:
data, addr = serversocket.recvfrom(1024)
print(f"Received: {data} from {addr}")
TCP:
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8080))
serversocket.listen()
while True:
clientsocket, addr = serversocket.accept()
data = clientsocket.recv(1024)
print(f"Received: {data} from {addr}")
clientsocket.send(bytes("Hello World!", "utf-8"))
clientsocket.close()
以上是Python下的UDP和TCP服务器端示例代码,其中使用了socket库,bind()绑定IP地址和端口号,recvfrom()和recv()阻塞等待数据的接收,send()和sendall()用于发送数据,close()用于关闭连接。