为什么应该使用TCP协议?
1)可靠的:网络传输中丢失的数据包会被检测,并被重新发送。
2)有序传送:数据按发送者写入的顺序被读取。
相反,使用 socket.SOCK_DGRAM 创建的 用户数据报协议 (UDP) Socket 是 不可靠 的,而且数据的读取写发送可以是无序的
TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。
TCP通信步骤:
TCP客户端:
# 1.创建套接字
Tcp_client_socket = socket.socket(socket.SOCK_AF_INET, socket.SOCK_STREAM)
# 2.链接服务器
Tcp_client_socket.connect((‘server_ip’, server_port))
# 3.向服务器发送数据hahaha
tcp_client_socket.send("hahaha".encode(‘utf-8’))
# 4.接收服务器回送数据
recv_data = Tcp_cilent_socket.recv(1024) # 返回的是字节类型的数据
# 5.关闭套接字
Tcp_client_socket.close()
TCP服务器端:
# 1.创建套接字
Tcp_sever_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.绑定服务器端口信息,服务器端口需要绑定便于客户端找到
Tcp_server_socket.bind((“”, 7788))
# 3.把监听由主动变为被动(监听)
Tcp_server_socket.listen(128)
# 4.等待客户端链接,在链接之前处于堵塞状态,一直到客户端链接才会解堵塞
# New_client_socket是服务器返回一个新的套接字专为客户端服务,client_addr返回客户端的ip、port
New_client_socket, client_addr = Tcp_server_socket.accept()
# 5.等待客户端发送数据,然后解堵塞
recv_data = new_client_socket.recv(1024).decode(‘utf-8’)
# 6.给客户端回送数据
New_client_socket.send(‘hello’.encode(‘utf-8’))
# 7.为该客户端服务完毕之后关闭套接字
New_client_socket.close()
# 8.关闭服务器端套接字
Tcp_server_socket.close()
TCP通信模型:
TCP特点
1. 面向连接
通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。
双方间的数据传输都可以通过这一个连接进行。
完成数据交换后,双方必须断开此连接,以释放系统资源。
这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。
2. 可靠传输
1)TCP采用发送应答机制
TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功
2)超时重传
发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。
3)错误校验
TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
4) 流量控制和阻塞管理
流量控制用来避免主机发送得过快而使接收方来不及完全收下。
TCP与UDP的不同点
- 面向连接(确认有创建三方交握,连接已创建才作传输。)
- 有序数据传输
- 重发丢失的数据包
- 舍弃重复的数据包
- 无差错的数据传输
- 阻塞/流量控制