-
osi五层模型
-
应用层
-
传输层
-
四层交换机、四层路由器
-
TCP
-
可靠的全双工通信
-
效率低
-
三次握手
-
客户端向服务端发送syn请求
-
服务端回复客户端ACK并发送syn请求
-
客户端回复服务端ACK表示建立连接
-
由客户端的connect + 服务端的accept
-
-
四次挥手
-
服务端向客户端发送fin请求
-
客户端收到请求回复ACK
-
客户端发送fin请求
-
服务端收到请求回复ACK确认
-
由客户端的close与服务端的close完成
-
-
-
UDP:
-
效率高
-
不可靠的连接
-
无连接
-
-
-
网络层
-
ip协议(ipv4,ipv6)
-
路由器、交换机
-
-
数据链路层
-
arp协议,地址解析协议,通过IP找mac地址
-
-
物理层
-
二、今日内容
-
-
在连接内多和客户端说几句
-
能够接收到读懂个客户端的请求
-
#cleint 客户端
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8001))
while True:
ret = sk.recv(1024)
print(ret.decode('utf-8'))
if ret.decode('utf-8') == 'Q':
break
msg = input('>>>>>')
sk.send(msg.encode('utf-8'))
if msg.upper() == 'Q':
break
sk.close()
#server 服务端
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8001))
sk.listen()
while True:
conn,addr = sk.accept() #三次握手
while True:
msg = input('>>>>')
conn.send(msg.encode('utf-8'))
if msg == 'Q':
break
ret = conn.recv(1024)
print(ret.decode('utf-8'))
if ret.decode('utf-8') == 'Q':
break
conn.close() #四次挥手
sk.close()
-
udp协议的编程
#client 客户端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
server_ip = ('127.0.0.1',9001)
while True:
msg = input('>>>>>')
sk.sendto(msg.encode('utf-8'),server_ip)
if msg.upper() == 'Q':break
msg_recv = sk.recv(1024).decode('utf-8')
if msg_recv.upper() == 'Q':break
print(msg_recv)#server 客户端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9001))
while True:
msg,addr = sk.recvfrom(1024)
print(msg.decode('utf-8'))
msg_send = input('请输入》》》》》')
sk.sendto(msg_send.encode('utf-8'),addr)
-
粘包现象
-
只出现在tcp协议中,多条消息之间没有边界,并且还有一大堆优化的算法
-
出现位置
-
发送端:两条新消息都很短,发送间隔时间也很短
-
接收端:多条消息由于没有及时接收,而在接收方的缓存端,堆在一起了
-
-
struck模块处理粘包问题
-
每次传输之前把传输的长度发送到接收方,接收方每次在接收消息时,先接收长度,,然后在接收数据
import struct
s = 'fhdakjdhjka'
ret = struct.pack('i',len(s))
print(ret)
res = struct.unpack('i',ret)
print(res)
print(res[0]) -
-
三、作业
-
文件发送 tcp
-