传输控制协议
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
关键特性
- 可靠性:
-
通过确认机制和重传机制,确保数据不丢失、不重复。
-
通过校验和检查数据完整性。
- 面向连接:
- 在数据传输前需要建立连接,传输结束后需要关闭连接。
- 有序性:
- 数据按发送顺序到达接收方。
- 流量控制:
- 通过滑动窗口机制,动态调整发送速率。
- 拥塞控制:
- 通过慢启动、拥塞避免等算法,避免网络拥塞。
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包,表示确认。连接正式关闭。
总结
从三次握手 和四次挥手 不难看出,每次都是客户端 先发起请求(SYN或FIN),而服务端 同步确认(SYN-ACK)是一起发送的,而结束FIN需要先确认(ACK)服务端 的请求,再发送结束请求(FIN)等待客户端确认后才会关闭连接。
参考
文档内容参考自如下:
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("客户端连接已关闭")