讲tcp 之前先回顾以下udp 的执行流程:
创建一个基于udp的网络程序流程很简单,具体步骤如下:
- 创建客户端套接字
- 发送/接收数据
- 关闭套接字
向对方主机发送数据:
from socket import * # 1. 创建udp套接字 udp_socket = socket(AF_INET, SOCK_DGRAM) # 2. 准备接收方的地址 # '192.168.1.103'表示目的ip地址 # 8080表示目的端口 dest_addr = ('192.168.1.103', 8080) # 注意 dest_adrr是元组,ip是字符串,端口是数字 # 3. 从键盘获取数据 send_data = input("请输入要发送的数据:") # 4. 发送数据到指定的电脑上的指定程序中 # encode 编码 decode 解码 utf-8 因为 windows 环境下 默认编码是utf-8 有一个概念是发送文件和接受文件的双方 关于文件内容的编码格式要保持一致 如果你用utf-8给对方发的数据,对方却用gbk 解码 这样看到的就是乱码 udp_socket.sendto(send_data.encode('utf-8'), dest_addr) # 5. 关闭套接字 udp_socket.close()
TCP 运行流程:
客户端向服务器发送链接,服务器端收到后建立一个双方的链接,客户端才能向服务器发送数据,服务器收到数据后,会向客户端回复一段短小的数据表示已经成功这样才能说明一段数据才算完成传输,如果客户端在一段固定的时间段内未收到服务器端返回的数据,客户端会认为数据包丢失了,会重新向服务器段发送数据包,另外tcp 发送数据的方式一段,一段,而udp 是一次将所有的数据全部发送给服务器,tcp先发送一段数据给服务器,服务器收到后会向客户端返回一个提示数据,表示已经收到,客户端才能向服务器端接着发送下一段数据,以此类推直到数据完成发送,如果有一段数据,服务器端未收到数据,客户端未收到来此服务器端的确认返回,客户端会从新向服务器端发送这一段数据。
# tcp 协议 TCP 传输控制协议 是一种面向连接的。可靠的,基于字节流的传输曾通信协议 TCP 的通信需要经过创建连接,数据传送,终止连接的三个步骤 通信双方必须先建立连接才能进行数据的传输,双方完成数据交互后双方必须断开此连接,以释放系统资源 tcp 连接事一对一的, 因此TCP 不适用于广播的应用程序,基于广播的应用程序请使用udp协议 2. 可靠传输 1)TCP采用发送应答机制 TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功 2)超时重传 发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。 TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。 3)错误校验 TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。 4) 流量控制和阻塞管理 流量控制用来避免主机发送得过快而使接收方来不及完全收下。 TCP 和 UDP 的不同 面向连接(确认有创建三方交握,连接已创建才作传输。) 有序数据传输 重发丢失的数据包 舍弃重复的数据包 TCP客户端: 客户端发送数据的一方,,服务器端接收数据并且返回确认的一方 tcp 客户端构建流程
from socket import *
# 创建socket
#这是专门用于等待客户端发起连接的套接字 这里会产生一个堵塞,直到有客户端对其发起链接后堵塞消除,不然他就会一直在这里等待。
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 目的信息
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器port:"))
# 链接服务器
tcp_client_socket.connect((server_ip, server_port))
# 提示用户输入数据
send_data = input("请输入要发送的数据:")
tcp_client_socket.send(send_data.encode("gbk"))
# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode('gbk'))
# 关闭套接字
tcp_client_socket.close()
tcp 通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话""