Python—TCP协议

文章目录

  • 网络编程
    • TCP简介
      • TCP特点
        • 面向连接
        • 可靠传输
      • TCP和UDP的不同点
        • 可靠传输
      • TCP和UDP的不同点
      • tcp注意点
      • TCP协议
      • TCP三次握手
      • TCP四次挥手

网络编程

TCP简介

TCP协议,传输控制协议(Transmission Control Prorocol)是一种面向连接的。可靠的、基于字节流的传输层通信协议

TCP通讯需要经过创建连接,传输数据,终止连接三个步骤

TCP特点

面向连接

通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。

双方间的数据传输都可以通过这个连接进行。

完成数据交换后,双方断开此连接,以释放系统资源。

这种连接是一对一的

因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议

可靠传输

1)TCP采用发送应答机制

TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

2)超时重传

发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

3)错误校验

TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

  1. 流量控制和阻塞管理

流量控制用来避免主机发送得过快而使接收方来不及完全收下。

TCP和UDP的不同点

  • 面向连接
  • 有序的数据传输
  • 重发丢失的数据包
  • 无差错的数据传输(舍弃重复的数据包,舍弃重复的数据包)
  • 阻塞/流量控制
    可以通过这个连接进行。

完成数据交换后,双方断开此连接,以释放系统资源。

这种连接是一对一的

因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议

可靠传输

1)TCP采用发送应答机制

TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功

2)超时重传

发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。

TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。

3)错误校验

TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

  1. 流量控制和阻塞管理

流量控制用来避免主机发送得过快而使接收方来不及完全收下。

TCP和UDP的不同点

  • 面向连接

  • 有序的数据传输

  • 重发丢失的数据包

  • 无差错的数据传输(舍弃重复的数据包,舍弃重复的数据包)

  • 阻塞/流量控制

  • TCP通信模型,类似’打电话’,在通信开始前一定要先建立相关连接,才能发送数据;而UDP通信模型,类似’写信’,不需要建立相关连接,只需要发送数据即可
    Python—TCP协议_第1张图片
    在Python中,用TCP进行socket编程也比较简单

  • 客户端

    • 要主动连接服务器的IP和指定端口
  • 服务器

    • 监听指定端口
    • 对于每一个新的连接,创建一个线程或者进程

通常,服务器程序可以无限运行下去。要注意的是,一个端口不能同时被两个socket绑定

TCP服务端和客户端的各自socket的创建和交互。

Python—TCP协议_第2张图片

TCP服务器

在python程序中,如果要完成一个tcp服务器的功能,需要的流程如下:

  • 1.socket创建一个套接字(买手机)
  • 2.bind() 绑定IP和Port(插卡)
  • 3.listen() 使套接字由主动变为被动连接,即开启监听模式(设置一个响铃模式)
  • 4.accept() 等待客户端的连接
  • 5.recv/send 接收/发送数据
  • 6.关闭和客户端交互的套接字
  • 7.关闭监听套接字
# 服务器端

import socket

#创建套接字
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#绑定本地信息
tcp_socket.bind(('',8080)) # port num>1024的随意用 <1024的一般指定了用途

#设置监听
tcp_socket.listen(5)

#创建新的套接字
new_socket,addr=tcp_socket.accept()

#收/发数据
content=new_socket.recv(1024)
print('接收到的数据:',content.decode('gbk'))
data=input('服务器发送的数据:')
new_socket.send(data.encode('gbk'))

# 关闭通信的socket
new_socket.close()

# 关闭用于监听的套接字
tcp_socket.close()

设置监听的目的:

socket默认为主动模式,listen()能够将主动模式改为被动模式,被动了才能接收信息listen(5),5是指可以同时接收到的客户端申请的最大数,超过则拒绝

创建新套接字的原因:

服务器接收到请求后,将生成一个新的套接字,专门给新来的客户端提供一对一的服务

此时,服务器套接字的任务就是等待一个新的客户端套接字连接

# 客户端

import socket

#创建套接字
tcp_client_socket=socket.socket(socket.AF_INET,socket.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('utf-8'))

#接收服务器端的信息
recv_data=tcp_client_socket.recv(1024)
print('接收到的数据为:',recv_data.decode('gbk'))

#关闭套接字
tcp_client_socket.close()
# 运行结果
客户端:
请输入服务器IP:10.27.198.206
请输入服务器port:8080
请输入要发送的数据:asd
接收到的数据为: 123

服务器端:
接收到的数据: asd
服务器发送的数据:123

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,因此服务端可以通过返回数据的长度来区别客户端是否已经下线

TCP协议

当应用程序希望通过TCP与另一个应用程序通信时,他会发送一个通信请求,这个请求必须被送到一个确切的地址。在双方"握手"之后,TCP将在两个应用程序之间建立一个全双工(full-duplex)的通信。这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或者双方关闭为止。

标志位,TCP的6个标志位

所谓标志位,一种二进制的指令

  • SYN:发起一个新连接
  • FIN:释放一个连接
  • ACK:确认
  • RST: 重新连接
  • PSH:将数据段送到应用程序
  • URG:紧急指针,指着紧要数据

Python—TCP协议_第3张图片

TCP三次握手

TCP是因特网的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后。等待对方的回答SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误的连接。

TCP三次握手的过程

  • 客户端发送SYN(seq=x)报文交给服务器端,进入SYN_SEND状态
  • 服务器端收到SYN报文,会因一个SYN(seq=y)+ACK(x+1)报文,进入SYN_RECV状态
  • 客户端收到服务器端的SYN报文,回应一个ACK(y+1)报文,进入Established状态

三次握手完成,TCP客户端和服务器端成功建立连接,可以开始传输数据。

TCP四次挥手

建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这个是由TCP的半关闭(Half-close)造成的

  • 1.某个应用进程首先调用close,称该端执行"主动关闭"(active close)。该端的TCP于是发送一个FIN字节,表示数据发送完毕
  • 2.接收到这个FIN的对端执行"被动关闭"(passive close),这个FIN由TCP确认

注意

FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相关的连接上再无额外数据可接收

  • 3.一段时间后,接收到这个文件结束符的应用进程将会调用close关闭它的套接字,这导致它的TCP也发送一个FIN
  • 4.接收这个最终FIN的原发送端TCP(即执行主动关闭的那一段)确认这个FIN。(既然每端都需要一个FIN和一个ACK,因此,通常需要4个字节)

Python—TCP协议_第4张图片

  • 广播
  • Mac地址
  • arp协议
  • 路由器
  • 局域网
  • 子网掩码

https://www.cnblogs.com/dalaoban/p/9330620.html?tdsourcetag=s_pcqq_aiomsg

你可能感兴趣的:(Python—TCP协议)