Python 31 TCP协议 socket套接字
Posted 温暖你的心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 31 TCP协议 socket套接字相关的知识,希望对你有一定的参考价值。
1、TCP协议
可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
(1)三次握手建链接
(2)四次挥手断开链接
(3)tcp协议的状态
(4)syn洪水攻击与半连接池
1、一开始,建立连接之前服务器和客户端的状态都为CLOSED; 2、服务器创建socket后开始监听,变为LISTEN状态; 3、客户端请求建立连接,向服务器发送SYN报文,客户端的状态变味SYN_SENT; 4、服务器收到客户端的报文后向客户端发送ACK和SYN报文,此时服务器的状态变为SYN_RCVD; 5、然后,客户端收到ACK、SYN,就向服务器发送ACK,客户端状态变为ESTABLISHED; 6、服务器端收到客户端的ACK后变为ESTABLISHED。此时3次握手完成,连接建立!
由于TCP连接是全双工的,断开连接会比建立连接麻烦一点点。 1、客户端先向服务器发送FIN报文,请求断开连接,其状态变为FIN_WAIT1; 2、服务器收到FIN后向客户端发送ACK,服务器的状态围边CLOSE_WAIT; 3、客户端收到ACK后就进入FIN_WAIT2状态,此时连接已经断开了一半了。如果服务器还有数据要发送给客户端,就会继续发送; 4、直到发完数据,就会发送FIN报文,此时服务器进入LAST_ACK状态; 5、客户端收到服务器的FIN后,马上发送ACK给服务器,此时客户端进入TIME_WAIT状态; 6、再过了2MSL长的时间后进入CLOSED状态。服务器收到客户端的ACK就进入CLOSED状态。 至此,还有一个状态没有出来:CLOSING状态。 CLOSING状态表示: 客户端发送了FIN,但是没有收到服务器的ACK,却收到了服务器的FIN,这种情况发生在服务器发送的ACK丢包的时候,因为网络传输有时会有意外。
LISTEN:等待从任何远端TCP 和端口的连接请求。 SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。 SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。 ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。 FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。 FIN_WAIT_2:等待远端TCP 的连接终止请求。 CLOSE_WAIT:等待本地用户的连接终止请求。 CLOSING:等待远端TCP 的连接终止请求确认。 LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认) TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。 TIME_WAIT 两个存在的理由: 1.可靠的实现tcp全双工连接的终止; 2.允许老的重复分节在网络中消逝。 CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)
from socket import socket, AF_INET, SOCK_STREAM IP = \'127.0.0.1\' PORT = 8888 ADDRESS = (IP, PORT) BUFSIZE = 1024 # 1.创建一个服务端对象(AF_INET:IPv4,SOCK_STREAM:sock流) ser_socket = socket(AF_INET, SOCK_STREAM) # 2.绑定服务器的IP地址,端口() ser_socket.bind(ADDRESS) # 3.设置半连接池,限制请求的个数 ser_socket.listen(5) # 4.等待客户端请求 cli_socket, cli_adrr = ser_socket.accept() print(cli_socket) print(cli_adrr) # 5.收发数据 data = cli_socket.recv(BUFSIZE) print(data.decode(\'utf-8\')) cli_socket.send(\'服务器已接收到数据\'.encode(\'utf-8\')) # 只能以字节类型发送 # 6.关闭与客户端的连接 cli_socket.close() # 7.关闭服务器(一般不会关闭服务器) # ser_socket.close() TCP服务端
from socket import socket, AF_INET, SOCK_STREAM IP = \'127.0.0.1\' PORT = 8888 ADDRESS = (IP, PORT) BUFSIZE = 1024 # 1.创建客户端socket对象 cli_socket = socket(AF_INET, SOCK_STREAM) # 2.连接服务器 cli_socket.connect(ADDRESS) # 3.发收数据 cli_socket.send(\'hello\'.encode(\'utf-8\')) # 只能以字节类型发送 data = cli_socket.recv(BUFSIZE) print(data.decode(\'utf-8\')) # 关闭客户端连接 cli_socket.close() TCP客户端
2、socket套接字
(1)socket层socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
Socket是封装好TCP/IP协议的接口。
(2)什么是socket
(3)如何用socke
以上是关于Python 31 TCP协议 socket套接字的主要内容,如果未能解决你的问题,请参考以下文章