1,OSI七层网络协议,及传输层
OSI的七层分层:
应用层:为应用程序提高服务
表示层:负责数据格式的转化和加密服务
会话层:负责建立与维护会话
传输层:建立与管理端到端的连接 TCP/UDP
网络层 :IP地址及路由选择 IP/ICMP
数据链路层:提供介质访问及链路管理 ARP/RARP
物理层:即物理设备
以下对各层的解释转载来自:https://www.jmjc.tech/tutorial/python/51
物理层
:主要是物理通信的媒介,比如 光纤
、电缆
、电磁波
等...
数据链路层
:把电脑通过物理介质(光纤,WiFi ...)串联起来,组成 局域网
,也是我们常说的内网
。【局域网的通信通过 MAC 地址】
网络层
:这一层的主要设备是 路由
,路由的工作是把无数的局域网组合起来,成为 互联网
。到这里,我们就能上网了。【互联网的通信通过IP】
传输层
:通过网络层,两台电脑能交流了,但是两台电脑的交流通常是两个软件之间的交流
,传输层负责的,就是把信息转发到对应的软件上。【每个软件都有特定的端口,传输层的通信通过端口】
应用层
:应用层还可以在拆分三层 会话层
、表示层
、应用层
,但是整体一样,我们就统一称呼。这一层主要是对 传输层
的封装,用于解决一些特定的领域,例如 HTTP协议
、DNS协议
等... 都是应用层协议。
HTTP/HTTPs/FTP/SMTP是应用层协议,但是也囊括了表示层会话层的作用。
socket 是传输层协议TCP和UDP的应用。传输层实现端到端的通信,每个传输层连接两个端点。端点是什么?端点就是套接字(so ke t)RFC973规定:端口号的拼接IP地址构成了套接字,即形如:(主机IP地址:端口号)
2,socket
socket方法:
socket()创建套接字
bind()指定本地地址
connect()将套接字连接到目的地址
listen()设置等待连接状态,listen函数将socket变为被动类型的,等待客户的连接请求。
accept()建立连接
图来自:https://blog.csdn.net/weixin_39258979/article/details/80835555
3,栗子
服务器端
import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建socket对象
s.bind(('127.0.0.1', 9999))#绑定本地地址
s.listen(5)#设置等待链接状态
def lind_handle_data(conn,addr):
name=threading.current_thread().name
print(name)
data = conn.recv(1024).decode('utf-8')
data+=","+name
conn.send(data.encode('utf-8'))
conn.close()
while True:
conn, addr = s.accept()
t=threading.Thread(target=lind_handle_data,args=(conn,addr))
t.start()
服务器端采用多线程,等待连接,每次一个连接启动一个线程处理
客户端
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM);
s.connect(('127.0.0.1', 9999))
s.sendall(b'hello')
data=s.recv(1024)
print(data)
s.close()
客户端每次启动,获得输出结果:
yxxdeMacBook-Pro:python_learn yxx$ python3 python_socket_client.py
b'hello,Thread-1'
yxxdeMacBook-Pro:python_learn yxx$ python3 python_socket_client.py
b'hello,Thread-2'
yxxdeMacBook-Pro:python_learn yxx$ python3 python_socket_client.py
b'hello,Thread-3'
yxxdeMacBook-Pro:python_learn yxx$