zoukankan      html  css  js  c++  java
  • 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







  • 相关阅读:
    python+selenium截图
    selenium鼠标事件
    python位置参数、默认参数、关键字参数、可变参数的区别
    元素定位
    selenium下拉框选择
    mysql计算日期的函数
    python列表操作
    requests库及请求封装
    什么是接口测试?如何进行接口测试
    类和实例
  • 原文地址:https://www.cnblogs.com/zedong/p/9557397.html
Copyright © 2011-2022 走看看