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:不在连接状态(这是为方便描述假想的状态,实际不存在)
三次握手,四次挥手的11种状态

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服务端
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客户端
TCP客户端


2、socket套接字
(1)socket层

socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
Socket是封装好TCP/IP协议的接口。

(2)什么是socket



(3)如何用socke







猜你喜欢

转载自www.cnblogs.com/zedong/p/9557397.html