一、三次握手和四次挥手
- 三次握手
- 客户端和服务端都处于closed状态, 客户端主动打开连接,服务端被动打开连接
- 服务端创建传输控制块TCB,进入LISTEN(监听)状态
- 客户端创建传输控制块TCB,向服务端发送连接请求报文。
- 服务端收到请求报文后,如果同意连接,发出确认报文。
- 客户端收到确认后,向服务端发送确认,客户端进入ESTABLISHED(已建立连接)状态
- 服务器收到客户端的确认后也进入ESTABLISHED状态,双方可以开始通信。
- 四次挥手
- 客户端和服务端都处于ESTABLISHED状态,客户端主动关闭,服务端被动关闭
- 客户端发送连接释放报文,并停止发送数据
- 服务器收到连接释放报文,发出确认报文,进入CLOSE-WAIT(关闭等待)状态。此时服务端发送数据,客户端仍然要接收。
- 客户端收到服务器的确认请求后,进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文
- 服务器发送完最后的数据,向客户端发送连接释放报文,进入LAST-ACK(最后确认)状态,等待客户端确认。
- 客户端接收到释放报文后发出确认,TCP连接释放后,进入CLOSED状态。
- 服务器收到确认,进入CLOSED状态
二、基于TCP开发一款远程CMD程序
#服务器 import socket import subprocess server = socket.socket() server.bind( ('127.0.0.1',9000) ) server.listen(5) while True: conn,addr = server.accept() print(addr) while True: try: data = conn.recv(1024).decode('utf-8') print(data) if len(data) == 0: continue if data == 'q': break obj = subprocess.Popen( data,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE ) msg = obj.stdout.read() error = obj.stderr.read() if msg: print(msg.decode('gbk')) conn.send(msg) else: print(error.decode('gbk')) conn.send(error) except Exception as e: print(e) break conn.close()
#客户端 import socket client = socket.socket() client.connect( ('127.0.0.1',9000) ) while True: cmd = input('请输入命令').strip() client.send(cmd.encode('utf-8')) if cmd == 'q': break data = client.recv(1024).decode('gbk') print(data)