• 课后作业 day26


    课后作业 day26

    一 TCP三次握手、四次挥手图

    三次握手

    第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认

    第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),此时服务器进入SYN_RECV状态

    第三次握手:客户端收到服务器的SYN+ACK包,并向服务器发送ACK确认包,此包发送完毕,客户端和服务器都进入 ESTABLISHED 状态(TCP连接成功)

    四次挥手

    1. 客户端进程发送连接释放报文,并且停止发送数据.释放数据报文首部,FIN=1,此时客户端进入FIN-WAIT-1状态
    2. 服务器收到连接释放报文,发送确认报文,ACK=1,ack=u+1,并且带上自己的序列号,此时服务端进入CLOSE-WAIT(关闭等待)状态.客户端收到服务器的确认请求之后,此时,客户端就进入FIN-WAIT-2状态,等待服务器发送连接释放报文(在这之前还需要接收服务器发送的最后数据)
    3. 服务器将所有的数据发送完毕之后,就像客户端发送连接释放报文,FIN=1,ack=u+1.此时服务器进入LAST-ACK(最后确认)状态,等待客户确认
    4. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,此时客户端就进入了TIME-WAIT(时间等待)状态.(此时TCP连接还没有释放,需经过2MSL的时间后,才进入CLOSED状态).服务器只要收到了客户端发出的确认请求,就立刻进入CLOSED状态

    二 基于TCP开发一款远程CMD程序

    客户端连接服务器后,可以向服务器发送命令
    服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端

    #客户端
    import socket
    
    client = socket.socket()
    client.connect(('192.168.13.161',8888))
    while True:
        cmd_msg = input('请输入CMD命令:')
        client.send(cmd_msg.encode('utf-8'))
    
        if cmd_msg == 'q':
            break
    
        data = client.recv(1024).decode('utf-8')
    
        print(data)
    client.close()
    
    #服务端
    import socket
    import subprocess
    
    server = socket.socket()
    server.bind(('192.168.13.161',8888))
    server.listen(3)
    conn,addr = server.accept()
    while True:
        data = conn.recv(1024).decode('utf8')
    
        if data == 'q':
            break
    
        retcode, output = subprocess.getstatusoutput(data)
        print(retcode, output)
        output = output.encode('utf8')
    
        conn.send(output)
    
    conn.close()
    
  • 相关阅读:
    Spring事务传播特性NOT_SUPPORTED使用演示
    spring配置基于xml的声明式事务
    反射的简单应用
    MyBatis批处理工具类MyBatisBatchHelper.java
    Mybatis分页插件PageHelper的使用
    利用Spring的Profile加载指定数据源
    Nginx状态信息(status)配置及信息详解
    nginx配置基于域名、端口、IP的虚拟主机
    Nginx Linux安装与部署
    rename 批量修改文件名简单用法
  • 原文地址:https://www.cnblogs.com/samoo/p/11694160.html
Copyright © 2020-2023  润新知