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'))
posted @ 2019-06-26 15:40  enazede  阅读(181)  评论(0)    收藏  举报