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("客户端连接已关闭")
相关推荐
Tandy12356_4 小时前
手写TCP/IP协议栈——环境配置
服务器·网络·网络协议·tcp/ip
老蒋新思维4 小时前
创客匠人洞察:创始人 IP 变现的长期主义,文化根基与 AI 杠杆的双重赋能
大数据·网络·人工智能·tcp/ip·重构·创始人ip·创客匠人
clear sky .4 小时前
TCP,UDP使用socket编程流程
网络协议·tcp/ip·udp
车载测试工程师5 小时前
CAPL学习-ETH功能函数-事件过程函数参考补充说明
tcp/ip·以太网·capl·canoe·doip
Jtti5 小时前
高防ip和普通ip两者有何区别?
运维·网络协议·tcp/ip
繁华似锦respect5 小时前
Linux - KCP 协议深度解析:原理、与 TCP/UDP 的对比及应用场景
linux·tcp/ip·观察者模式·设计模式·udp
垦***耪5 小时前
三相异步电动机矢量控制Matlab仿真之旅
tcp/ip
讨厌下雨的天空6 小时前
传输层TCP协议
服务器·网络协议·tcp/ip
老蒋新思维6 小时前
创客匠人峰会复盘:AI 赋能 IP 创新增长,知识变现的 4 大实战路径与跨行业案例
大数据·网络·人工智能·tcp/ip·创始人ip·创客匠人·知识变现