1.tcp协议:传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
2.tcp通信的三个步骤:创建连接、数据传送、终止连接
tcp的特点:
1.面向连接:一对一连接,不适用于广播的应用程序
2.可靠传输:
2.1采用发送应答机制
2.2超时重传
2.3错误校验
2.4流量控制和阻塞管理
tcp和udp的不同(相比udp的优势):
1.面向连接
2.有效数据传输
3.重发丢失的数据包
4.舍弃重复的数据包
5.无差错的数据传输
6.阻塞/流量控制
tcp客户端和tcp服务端的区别:
服务器(server):提供服务的一方
客户端(client):需要被服务的一方
网络TCP通信的思维:
tcp客户端的构建流程:
1.创建套接字
2.连接服务器
3.收发数据
4.关闭套接字
tcp服务端的构建流程:
1.socket创建套接字
2.bind绑定固定信息
3.listen设置套接字可以被动链接
4.accept等待客户端的链接
5.recv/send接收/发送数据
网络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
tcp服务器中listen会引起堵塞,直到有客户端连接接
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()
Listen(backlog)数值代表的含义?
监听变主动为被动,backlog指定最多允许多少个客户连接到服务器。它的值至少为1。
收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
请注意,最大限制是取决于操作系统,Ubuntu上默认是128
TCP服务端recv解堵塞的两种方式?
1、收到客户端发送的数据
2、客户端关闭了套接字
可以通过判断收到数据的长度来判断客户端是否下线,长度为0代表已下线。
注意:
tcp服务器中accept会返回一个元祖:(新的套接字,客户端信息)
下面所进行的操作,都是通过这个新的套接字完成