课后作业 day26
一 TCP三次握手、四次挥手图
三次握手
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认
第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),此时服务器进入SYN_RECV状态
第三次握手:客户端收到服务器的SYN+ACK包,并向服务器发送ACK确认包,此包发送完毕,客户端和服务器都进入 ESTABLISHED 状态(TCP连接成功)
四次挥手
- 客户端进程发送连接释放报文,并且停止发送数据.释放数据报文首部,FIN=1,此时客户端进入FIN-WAIT-1状态
- 服务器收到连接释放报文,发送确认报文,ACK=1,ack=u+1,并且带上自己的序列号,此时服务端进入CLOSE-WAIT(关闭等待)状态.客户端收到服务器的确认请求之后,此时,客户端就进入FIN-WAIT-2状态,等待服务器发送连接释放报文(在这之前还需要接收服务器发送的最后数据)
- 服务器将所有的数据发送完毕之后,就像客户端发送连接释放报文,FIN=1,ack=u+1.此时服务器进入LAST-ACK(最后确认)状态,等待客户确认
- 客户端收到服务器的连接释放报文后,必须发出确认,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()