zoukankan      html  css  js  c++  java
  • TCP三次握手和四次挥手

    TCP协议

    数据从客户端----->服务端的协议

    三次握手的建立连接

    举个栗子,如果你要去服务端下载视频,客户端和服务端之间必须得连接,而连接就是三次握手:

    首先,在连接之前客户端和服务端都是处于close状态的,主动打开的是客户端,被动打开的是服务器

    1.客户端会像服务端发起一个请求,如下载视频,会有一个SYN报头

    2.服务端会接受客户端的请求,然后会响应客户端,并且把SYN报头改装好后又返回客户端,会有ACK报头

    3.客户端开始进入建立连接状态,再发送一条请求,请求带上ACK给服务器,让服务器进入连接状态

    • 1次握手

      1.客户端直接进入连接状态,直接发送请求给服务端,直接进入连接状态

    • 2次

      1,客户端暂时不进入连接状态,发送一条请求给服务端

      2,服务端直接进入连接状态,发送一条确定请求给客户端,客户端收到直接进入连接状态

    四次挥手关闭连接

    ​ 1、客户端会发送请求 带上FIN报头给服务端,说我够了,要断开连接

    ​ 2、服务端接收到客户端的请求后,返回一个带有ACK报头的请求说确定了

    FIN报头并没有返回,但是服务端此时还有可能传输数据

    ​ 3、服务端数据传输结束之后,服务端又会发送一次带有报头FIN的请求,告诉客户端我所有的数据发完了,示意结束吧

    如果只有三次连接,但是客户端可能在第二次连接之后死掉了,客户端压根没有接收到2-3步之间的传输数据,然后服务端就是回复给你发送请求了

    ​ 4、所以必须得有第四次,客户端向服务端再进行一次确认,说明我收到了你中途发的数据

    服务端:

    import socket
    
    #1、符合tcp协议的手机
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    #2、绑定手机号
    server.bind(('127.0.0.1',8000))# 127.0.0.1代表本地
    
    server.listen(5)               #半连接池
    
    #3、等待客户端连接
    print('start...')
    
    链接循环
    
    

    客户端:

    import socket
    
    
    #1、创建符合TCP协议的手机
    client = socket.socket(socket.AF_INET,socket.SOCK.STREAM)
    
    #2、拨号
    client.connect(('127.0.0.1',8000))
    
    while True:
        msg = input('please enter your msg')    #dir
        
        #3、发送信息
        client.send(msg.encode('utf8'))
        
        
        #4、接收信息
        data = client.recv(1024)
        print(data)
        
    
    

    ssh服务端:

    import socket
    impore subprocess
    
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    server.bind('192.0.0.1',8000)
    server.listen(5)
    
    print('start...')
    
    while True:
        conn,client_addr = server.accept()
        print(client_addr)
        while True:
            try:
                cmd = conn.recv(1034)
                print(cmd)
                
                #帮你执行cmd命令,然后把执行结果保存到管道里
                pipeline = subprocess.Popen(cmd.decode('utf8'),
                                            shell = True,
                                            stderr =subprocess.PIPE,
                                            stdout = subprocess.PIPE)
                
                stderr = pipeline.stderr.read()
                stdout = pipeline.stout.read()
                
                conn.send(stderr)
                conn.send(stdout)
                
            except ConnectionResetError
            	break
                
                																
                
    

    ssh客户端

    import socket
    
    # 1. 创建符合TCp协议的手机
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
    # 2. 拨号
    client.connect(('192.168.11.1',8000))
    
    while True:
        msg = input('please enter your msg')  # dir
        # 3. 发送消息
        client.send(msg.encode('utf8'))
    
        # 4. 接收消息
        data = client.recv(10)
        print(data.decode('gbk'))
  • 相关阅读:
    PHP 生成随机字符串与唯一字符串
    大数据和AI怎么与现代教育相结合?
    大数据和AI怎么与现代教育相结合?
    python正常时间和unix时间戳相互转换的方法
    python正常时间和unix时间戳相互转换的方法
    人人都谈大数据,你考虑过小数据的感受吗
    人人都谈大数据,你考虑过小数据的感受吗
    浅析机器学习的主题模型和语义分析
    浅析机器学习的主题模型和语义分析
    大数据对当代企业推广价值何在
  • 原文地址:https://www.cnblogs.com/zhuyuanying123--/p/11090233.html
Copyright © 2011-2022 走看看