📜  udp 和 tcp 完整形式 (1)

📅  最后修改于: 2023-12-03 15:20:47.414000             🧑  作者: Mango

UDP和TCP

概念

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()用于关闭连接。