课后作业 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()
posted @ 2019-10-17 19:06  simple123  阅读(179)  评论(0编辑  收藏  举报