TCP协议,传输控制协议(Transmission Control Prorocol)是一种面向连接的。可靠的、基于字节流的传输层通信协议
TCP通讯需要经过创建连接,传输数据,终止连接三个步骤
通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。
双方间的数据传输都可以通过这个连接进行。
完成数据交换后,双方断开此连接,以释放系统资源。
这种连接是一对一的
因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。
1)TCP采用发送应答机制
TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功
2)超时重传
发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。
3)错误校验
TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
流量控制用来避免主机发送得过快而使接收方来不及完全收下。
完成数据交换后,双方断开此连接,以释放系统资源。
这种连接是一对一的
因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。
1)TCP采用发送应答机制
TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功
2)超时重传
发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。
3)错误校验
TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
流量控制用来避免主机发送得过快而使接收方来不及完全收下。
面向连接
有序的数据传输
重发丢失的数据包
无差错的数据传输(舍弃重复的数据包,舍弃重复的数据包)
阻塞/流量控制
TCP通信模型,类似’打电话’,在通信开始前一定要先建立相关连接,才能发送数据;而UDP通信模型,类似’写信’,不需要建立相关连接,只需要发送数据即可
在Python中,用TCP进行socket编程也比较简单
客户端
服务器
通常,服务器程序可以无限运行下去。要注意的是,一个端口不能同时被两个socket绑定
TCP服务端和客户端的各自socket的创建和交互。
TCP服务器
在python程序中,如果要完成一个tcp服务器的功能,需要的流程如下:
# 服务器端
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与另一个应用程序通信时,他会发送一个通信请求,这个请求必须被送到一个确切的地址。在双方"握手"之后,TCP将在两个应用程序之间建立一个全双工(full-duplex)的通信。这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或者双方关闭为止。
标志位,TCP的6个标志位
所谓标志位,一种二进制的指令
TCP是因特网的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后。等待对方的回答SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误的连接。
TCP三次握手的过程
三次握手完成,TCP客户端和服务器端成功建立连接,可以开始传输数据。
建立一个连接需要三次握手,而终止一个连接要经过四次挥手,这个是由TCP的半关闭(Half-close)造成的
注意
FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相关的连接上再无额外数据可接收
https://www.cnblogs.com/dalaoban/p/9330620.html?tdsourcetag=s_pcqq_aiomsg