• Python入门学习-DAY31-三次握手原理与四次挥手,socket


    三次握手原理

    TCP协议在传输之前会进行三次沟通,一般称为“三次握手”

     

    第一次握手:客户端此时的状态为SYN_SENT,客户端会先向服务器发送 序号为seq=x的SYN =1请求,说‘我想连接到服务器,可不可以’;

    第二次握手:服务器收到后,此时的状态由原来的监听状态LISTEN变为SYN_RCVD,对客户端发送的请求作出回应,返回了ACK=x+1(在原序号基础上加1,表示是对这个序号的回应),同时发出了一个序号为seq=y的SYN =1请求,说‘你想连接我,可以啊,那么我可以连接你吗’;

    第三次握手:客户端收到服务器的回应加请求后,此时的状态为ESTABLISHED,对服务器发送的请求作出回应,返回了ACK=y+1,说‘你也想连接我啊,可以啊,那么我们两个就连接起来了’,服务器收到客户端的同意后,状态为ESTABLISHED。此时,在客户端与服务端之间是有两条链接的,一条是服务端到客户端,还有客户端到服务端,就如两个城市之间的高速公路一样都是单项;

    四次挥手

     

    客户端与服务端连接要经历三次握手,然后断开连接要经历4次挥手

    第一次挥手:客户端此时的状态为FIN_WIAT_1,客户端会先向服务器发送序号为seq=x的FIN+ACK 请求,说‘我现在不想和你连接了,我想断开’,此时客户端到服务器的数据是已经发送完了;

    第二次挥手:服务器收到后,此时的状态为CLOSE_WAIT,对客户端的请求作出回应,返回了ACK=x+1,说‘我知道了’;

          客户端收到服务器的回应后,此时的状态为FIN_WIAT_2,没有任何操作。

    第三次挥手:但此时的服务端可能还有数据没有发送完,所以不会与ACK同时发送,只有等到数据都发送完了,才会发送序号为seq=y的FIN请求,说‘那么我们就拜拜,再见了您’

    第四次挥手:客户端收到服务器的请求后,此时的状态为TIME_WIAT,对服务器发送的请求作出回应,返回了ACK=y+1,说‘你也想和我断开啊,那么我们两个就分开吧’。此时就彻底断开连接了

    Socket

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

    模拟一个存在本地的服务器与客户端

    服务器

    import socket
    IP='192.168.13.118'
    PORT=8989
    ADDRESS=(IP,PORT)
    BUFFSIZE=1024
    
    client={'192.168.13.131':'姚晓锋','192.168.13.235':'盛琪良'}
    
    #1.买手机,是用来接收链接请求,从而建立链接的
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    #2.插手机卡,设置服务端的IP地址与端口
    phone.bind(ADDRESS)
    
    #3.开机,开启监视功能,链接池最大容量为5
    phone.listen(5)
    
    #4.等待电话请求,等待客户端的请求
    while True:
        conn,client_addr=phone.accept()
        # 5.收发消息
        data=conn.recv(BUFFSIZE)
        print('%s:'%client[client_addr[0]],data.decode('utf-8'))
        #返回给客户端的信息
        conn.send('我是你爸爸'.encode('utf-8'))
        #6.挂电话链接
        conn.close()

    客户端

    import socket
    IP='192.168.13.118'
    PORT=8989
    ADDRESS=(IP,PORT)
    BUFFSIZE=1024
    
    #1.买手机
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    #2.拨号,连接服务器的IP,端口
    phone.connect(ADDRESS)
    
    #3.发收消息
    phone.send('我一进来就看见常威在。。。'.encode('utf-8'))#只能发送bytes类型的
    data=phone.recv(BUFFSIZE)
    print('服务器返回的信息:',data.decode('utf-8'))
    
    #4.挂电话链接
    phone.close()

    
    
  • 相关阅读:
    结对项目之需求分析与原型设计
    第二次结对编程作业——毕设导师智能匹配
    历届软工作品、竞赛平台作品调研
    软件工程实践项目课程的自我目标
    Build to win!——获得小黄衫的感想
    VC++智能感知插件 Visual Assist X
    Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)
    安装cronsun管理定时脚本
    四层、七层负载均衡的区别
    使用LVS实现负载均衡原理及安装配置详解
  • 原文地址:https://www.cnblogs.com/xvchengqi/p/9556198.html
Copyright © 2020-2023  润新知