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'))