TCP与TCP聊天器
2020-04-28 本文已影响0人
木叶苍蓝
TCP简介
TCP协议:传输控制协议( Transmission Control Protocol)是一种面向连接的,可靠地,基于字节流的传输层通信协议。
TCP通信需要经过创建连接,数据传输,终止连接三个步骤。
TCP通信模型中,在通信开始之前,一定要先建立相关连接,才能发送数据。类似于生活中的打电话。
TCP特点
1、面向连接
通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。
双方之间的数据传输都可以在这一个连接上进行。
完成数据交换后,双方必须断开此连接,以释放系统资源。
这种连接时一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP。
2、可靠传输
- TCP采用发送应答机制
TCP发送的每一个报文段都必须得到接收方的应答才认为这个TCP报文传输成功。
- TCP采用发送应答机制
- 超时重传
发送端发出一个报文段之后就启动定时器,如果在规定的时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包按序接收,然后接收端实体对已经成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设已丢弃将会进行重传。
- 超时重传
- 错误校验
TCP用一个校验和函数来校验数据是否有错误,在发送和接收时都要计算校验和。
- 错误校验
- 流量控制和阻塞管理
流量控制用来避免主机发送得过快而使接收方来内存占满。
- 流量控制和阻塞管理
TCP与UDP的不同点
- 面向连接(确认有三次握手,连接建立之后才会传输数据)
- 有序数据传输
- 重发丢失的数据包
- 舍弃重复的数据包
- 无差错的数据传输
- 阻塞/流量控制
####### UDP通信模型
UDP通信模型中,在通信开始之前,不需要建立相关的连接,只需要发送数据即可,类似于生活中写信。
TCP通信模型
TCP通信模型中,在通信开始之前,一定要先建立相关连接,才能发送数据,类似于打电话。
TCP.png udp.png
TCP客户端
import socket
def main():
# 1. 创建tcp套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCKET_STREAM)
# 2. 连接服务器
# tcp_socket,connect("127.0.0.1", 7890)
server_ip = input("请输入要连接的服务器ip: ")
server_port = int(input("请输入要连接的服务器的port: "))
server_addr = (server_ip, server_port)
tcp_socket.connect(server_addr)
# 3. 发送数据/接收数据
send_data = input("请输入要发送的数据: ")
tcp_socket.send(send_data.encode("utf-8"))
# 4. 关闭套接字
tcp_socket.close()
if __name__ == "__main__":
main()
TCP服务器
import socket
def main():
# 1. 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 绑定端口
tco_server_socket.bind("127.0.0.1", 7890)
# 3. 监听端口
tcp_server_socket.listen(128)
while True:
# 4. 等待客户端连接
new_client_socket, client_addr = tcp_server_socket.accept()
print “一个新客户端到来: %s”%(str(client_addr),)
while True:
# 接收客户端发送的数据
recv_data = new_client_socket,recv(1024)
if recv_data:
# 返回数据给客户端
new_client_socket.send("hello world~~~".encode("utf-8"))
else:
break
# 关闭客户端套接字
new_client_socket.close()
# 关闭服务器套接字
tcp_server_socket.close()
if __name__ == "__main__":
main()