Python网络 tcp

TCP

TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是⼀ 种⾯向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
TCP通信需要经过创建连接、数据传送、终⽌连接三个步骤。
TCP通信模型中,在通信开始之前,⼀定要先建⽴相关的链接,才能发送数据,类似于⽣ 活中,"打电话"需要建立链接,确认发送结果,安全传输。

TCP与UDP的不同

  • ⾯向连接(确认有创建三⽅交握,连接已创建才作传输。)
  • 有序数据传输
  • 重发丢失的数据包
  • 舍弃重复的数据包
  • ⽆差错的数据传输
  • 阻塞/流量控制

TCP的特点

1. ⾯向连接
通信双⽅必须先建⽴连接才能进⾏数据的传输,双⽅都必须为该连接分配必要的系统内核 资源,以管理连接的状态和连接上的传输。
双⽅间的数据传输都可以通过这⼀个连接进⾏。
完成数据交换后,双⽅必须断开此连接,以释放系统资源。
这种连接是⼀对⼀的,因此TCP不适⽤于⼴播的应⽤程序,基于⼴播的应⽤程序请使⽤ UDP协议。
2. 可靠传输
1)TCP采⽤发送应答机制
TCP发送的每个报⽂段都必须得到接收⽅的应答才认为这个TCP报⽂段传输成功
2)超时重传
发送端发出⼀个报⽂段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报⽂段。
TCP为了保证不发⽣丢包,就给每个包⼀个序号,同时序号也保证了传送到接收端实体的 包的按序接收。然后接收端实体对已成功收到的包发回⼀个相应的确认(ACK);如果发 送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失 将会被进⾏重传
3)错误校验
TCP⽤⼀个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
4) 流量控制和阻塞管理
流量控制⽤来避免主机发送得过快⽽使接收⽅来不及完全收下。

在udp通信模型
udp通信模型中,在通信开始之前,不需要建立相关链接,只需要发送数据即可。

TCP严格区分客户端和服务端,服务端一般都需要绑定端口,否则客户端找不到该服务器,客户端一般不绑定端口,如果客户端绑定端口就会出现端口冲突导致无法多开的问题。

TCP的优势
面向连接(确认有创建三方交握,连接已创建才作传输。);有序数据传输;重发丢失的数据包;舍弃重复的数据包;差错的数据传输;阻塞/流量控制。

网络TCP通信实现步骤

TCP客户端

# 创建套接字

Tcp_client_socket = socket.socket(socket.SOCK_AF_INET, socket.SOCK_STREAM)

# 链接服务器

Tcp_client_socket.connect((‘server_ip’, server_port))

# 向服务器发送数据

tcp_client_socket.send(‘hello’.encode(‘utf-8))

# 接收服务器回送数据

Recv_data = Tcp_cilent_socket.recv(1024)  # 返回的是字节类型的数据

# 关闭套接字

Tcp_client_socket.close()


TCP服务端

# 创建套接字

Tcp_sever_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定端口信息,一定要做

Tcp_server_socket.bind((“”, 7788))

# 把监听由主动变为被动

Tcp_server_socket.listen(128)

# 等待客户端链接,在链接之前处于堵塞状态,一直到客户端链接才会解堵塞

# 返回一个新的套接字专为客户端服务、以及客户端的ip、port

New_client_socket, client_addr = Tcp_server_socket.accept()

# 等待客户端发送数据

Recv_data = new_client_socket.recv(1024).decode(‘utf-8)

# 可以给客户端回送数据

New_client_socket.send(‘hello’.encode(‘utf-8))

# 为该客户端服务完毕之后关闭套接字

New_client_socket.close()

# 关闭服务器端套接字

Tcp_server_socket.close()

#强制允许端口复用 tcpOrder_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)

Listen(backlog)数值代表的含义?
监听变主动为被动,backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。请注意,最大限制是取决于操作系统,Ubuntu上默认是128

TCP服务端recv解堵塞的两种方式?
1、收到客户端发送的数据
2、客户端关闭了套接字
可以通过判断收到数据的长度来判断客户端是否下线,长度为0代表已下线。

TCP注意点

  1. tcp服务器⼀般情况下都需要绑定,否则客户端找不到这个服务器
  2. tcp客户端⼀般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等 信息就好,本地客户端可以随机
  3. tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服 务器时必须要做的
  4. 当客户端需要链接服务器时,就需要使⽤connect进⾏链接,udp是不需要链接的⽽是 直接发送,但是tcp必须先链接,只有链接成功才能通信
  5. 当⼀个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字⽤来标记 这个客户端,单独为这个客户端服务
  6. listen后的套接字是被动套接字,⽤来接收新的客户端的链接请求的,⽽accept返回 的新套接字是标记这个新客户端的
  7. 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务 器,但是之前已经链接成功的客户端正常通信。
  8. 关闭accept返回的套接字意味着这个客户端已经服务完毕
  9. 当客户端的套接字调⽤close后,服务器端会recv解堵塞,并且返回的⻓度为0,因此 服务器可以通过返回数据的⻓度来区别客户端是否已经下线

exit(?)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值