TCP协议概要与Python示例

传输控制协议

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

关键特性

  1. 可靠性:
  • 通过确认机制和重传机制,确保数据不丢失、不重复。

  • 通过校验和检查数据完整性。

  1. 面向连接:
  • 在数据传输前需要建立连接,传输结束后需要关闭连接。
  1. 有序性:
  • 数据按发送顺序到达接收方。
  1. 流量控制:
  • 通过滑动窗口机制,动态调整发送速率。
  1. 拥塞控制:
  • 通过慢启动、拥塞避免等算法,避免网络拥塞。

TCP工作原理

TCP通过三次握手 建立连接,通过四次挥手终止连接,并在数据传输过程中使用确认机制、重传机制和流量控制来保证可靠性。

1.三次握手建立连接

  • SYN:客户端发送一个SYN包(同步请求)给服务器,表示请求建立连接。

  • SYN-ACK:服务器收到SYN包后,回复一个SYN-ACK(同步确认),表示同意建立连接。

  • ACK:客户端收到SYN-ACK包后,发送一个ACK包(确认),表示连接已建立。

2.数据传输

在连接建立后,TCP 通过以下机制确保数据的可靠传输:

  • 序列号和确认号:每个数据包都有一个序列号,接收方通过确认号告知发送方哪些数据已成功接收。

  • 重传机制:如果发送方未收到确认,会重新发送数据包。

  • 流量控制:通过滑动窗口机制,动态调整发送速率,避免接收方缓冲区溢出。

  • 拥塞控制:通过慢启动、拥塞避免等算法,动态调整发送速率,避免网络拥塞。

3.四次挥手终止连接

  • FIN :客户发送一个FIN包,表示请求关闭连接。

  • ACK :服务器收到FIN包后,回复一个ACK包,表示确认。

  • FIN :服务器发送一个 FIN 包,表示服务器也准备关闭连接。

  • ACK :客户端收到 FIN 包后,回复一个 ACK 包,表示确认。连接正式关闭。

总结

三次握手四次挥手 不难看出,每次都是客户端 先发起请求(SYNFIN),而服务端 同步确认(SYN-ACK)是一起发送的,而结束FIN需要先确认(ACK)服务端 的请求,再发送结束请求(FIN)等待客户端确认后才会关闭连接。

参考

文档内容参考自如下:

  1. 百度百科TCP定义

  2. 菜鸟教程TCP协议

Python简单示例

注意 :如果是需要在不同设备之间连接,将IP改为局域网IP或者公网IP

服务端

py 复制代码
# server.py
import socket

# 1. 创建 TCP Socket(AF_INET = IPv4, SOCK_STREAM = TCP)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2. 绑定 IP 和端口(监听本地 127.0.0.1:8080)
server_socket.bind(('127.0.0.1', 8080))

# 3. 开始监听,最多允许 5 个客户端排队
server_socket.listen(5)
print("服务器启动,等待客户端连接...")

# 4. 接受客户端连接(阻塞直到有连接)
client_socket, addr = server_socket.accept()
print(f"客户端 {addr} 已连接")

try:

# 5. 接收数据(最多 1024 字节)
data = client_socket.recv(1024)
print(f"收到消息: {data.decode('utf-8')}")

# 6. 发送回复
reply = "Hello from server!"
client_socket.send(reply.encode('utf-8'))

finally:

# 7. 关闭连接(触发四次挥手)
client_socket.close()
server_socket.close()
print("连接已关闭")

客户端

py 复制代码
# client.py
import socket

# 1. 创建 TCP Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2. 连接到服务器(触发三次握手)
client_socket.connect(('127.0.0.1', 8080))
print("已连接到服务器")

try:
# 3. 发送消息
msg = "Hello from client!"
client_socket.send(msg.encode('utf-8'))

# 4. 接收服务器回复
response = client_socket.recv(1024)
print(f"服务器回复: {response.decode('utf-8')}")

finally:
# 5. 关闭连接
client_socket.close()
print("客户端连接已关闭")
相关推荐
7ACE14 小时前
Wireshark TS | TLP 超时时间
网络·网络协议·tcp/ip·wireshark·tcpdump
_Evan_Yao1 天前
从 IP 路由到 Agent 路由:最长前缀匹配如何帮你分发任务?
java·网络·后端·网络协议·tcp/ip
数据法师1 天前
开源情报收集工具GhostTrack深度测评:IP、手机号、用户名的合规信息查询方案
网络·网络协议·tcp/ip
想成为优秀工程师的爸爸1 天前
第三十篇技术笔记:郭大侠学UDS - 人有生老三千疾,望闻问切良方医
网络·笔记·网络协议·tcp/ip·信息与通信
环流_2 天前
IP协议特性
网络·tcp/ip·智能路由器
计算机安禾2 天前
【Linux从入门到精通】第44篇:Linux网络协议栈与TCP参数调优
linux·网络协议·tcp/ip
时空自由民.2 天前
计算机网络通信之TCP/UDP
网络协议·tcp/ip·udp
时空自由民.2 天前
蓝牙GAP/GATT协议和计算机网络TCP/UDP通信对比
tcp/ip·计算机网络·udp
WIZnet2 天前
W55MH32 RTThread+TCP通信测试
网络·网络协议·tcp/ip
zjun10012 天前
TCP专栏-1.TCP协议概念说明
网络·网络协议·tcp/ip