TCP:Transmission Control Protocal 传输控制协议
是一种面向连接的,可靠的、基于字节流的传输层通信协议
数据传输的可靠性的处理方式,经典的 TCP 模型中通过如下两种方式完成连接的可靠性
三次握手建立连接
两个序号和三个标志位:(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
四次挥手断开连接
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
服务端开发
'''
TCP服务端模块
'''
import socket
#定义链接信息
HOST = ''
RORT = 8080
ADDRESS = (HOST,RORT)
#定义一个读写数据的缓冲字节大小
BUFFER = 1024
#创建一个TCP服务端套接字对象
#tcp_server = socket.socket()什么都不传默认tcp服务
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#指定的因特网寻址 面向链接的套接字
#绑定主机端口号
tcp_server.bind(ADDRESS)
#监听端口号:参数~排队的客户端
tcp_server.listen(5)
while True:
#等待客户端的链接,建立链接
print("waiting for connect...")
server_socket,addr = tcp_server.accept()
print("client already connect!welcome to server:",addr)
while True:
#发送一个消息给客户端
server_info = input("<服务端>请输入您要发送信息:")
server_socket.send(server_info.encode("utf-8"))
#接受客户端发送的消息
msg = server_socket.recv(BUFFER)
print("client:",msg.decode("utf-8"))
if msg == b'BYE':
#关闭套接字,释放资源
server_socket.close()
break
#程序结束时,关闭服务端
tcp_server.close()
客户端开发
'''
TCP客户端
'''
#引入需要的模块
import socket
#定义链接信息
TARGET_HOST = '192.168.13.28'
TARGET_PORT = 8080
TARGET_ADDRESS = (TARGET_HOST,TARGET_PORT)
#缓冲的字节大小
BUFFER = 1024
#创建一个TCP套接字对象
tcp_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#链接指定的主机
tcp_client.connect(TARGET_ADDRESS)
#收发消息
while True:
#接受服务器消息
msg = tcp_client.recv(BUFFER)
print("server:",msg.decode("utf-8"))
#向服务器发送消息
info = input("请输入您要发送的消息:")
tcp_client.send(info.encode("utf-8"))
if info == "BYE":
#关闭套接字
tcp_client.close()
break
print("客户端退出!")