day 27
1.OSI七层协议
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
osi七层是:应 表 会 传 网 数 物 (应用层,表示层,会话层,传输层,网络层,数据链路层,物理层)
tcp/ip 五层是: 应 传 网 数 物 (应用层,传输层,网络层,数据链路层,物理层)
tcp/ip四层: 应 传 网 网络接口层 (应用层,传输层,网络层,网络接口层:数据链路层和物理层)
物理层: 光缆,电缆,双绞线,无线电波
数据链路层: 以太网协议, 分成报头head和数据data两个部分,head里面包含mac地址(本机和另一条主机的mac地址),来进行广播
网络层: ip协议和arp协议
传输层: 建立端口到端口的通信(端对端通信), 端口范围 0-65535, 0-1023为系统占用端口.
127.0.0.1是本机程序间进行通信的地址,就是自己玩自己, 不和别人玩.
tcp协议: 面向连接,数据可靠,传输效率低,面向字节流,数据包长度没有限制
udp协议:面向无连接,数据不可靠,传输效率高,面向报文,总长度不超过65535字节.
在传输层有连接时候的三层握手和四次分手:简单的了解这意思.
三次握手是:客户端发送给服务端一个请求,服务端返回给客户端一个信息,之后服务端确认信息在发给服务端,确立建立好连接.
四次分手是:客户端发送分手的请求给服务端,服务端接收到消息先给客户端发送一个信息等待处理客户端的信息,客户端信息处理完成之后在发送给客户端确认分手的信息,客户端在给服务端的一个确认信息.
2.tcp和udp协议下的socket的区别:
socket又称套接字,也是一个模块,我们通常用模块中已经实现的方法建立两个进程之间的连接和通信.
socket 套接字有两种:基于文件型和基于网络型
1.基于文件类型的套接字家族: AF_UNIX
unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据
2.基于网络型的套接字家族:AF_INET(主要用的)
TCP:可靠的,面向连接的协议,传输效率低(发送缓存&接受缓存),面向字节流.使用TCP的应用;Web浏览器;文件传输程序.
UDP:不可靠的,无连接的服务,传输效率高(发送前延迟小),一对一,一对多,多对一,多对多,面向报文(数据包),尽量女里服务,无拥塞控制.使用UDP的应用:域名系统(DNS);视频流;IP语音(VoIP).
1.TCP协议下的socket通讯流程图片:
tcp服务端
import socket server = socket.socket() server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 端口号可以多次使用 ip_port = ('127.0.0.1',8001) server.bind(ip_port) server.listen(3) ##在客户端连接后,还可以连接3个 while 1: conn,addr = server.accept() while 1: from_client_msg = conn.recv(1024) print('来自客户端的消息:',from_client_msg.decode('utf-8')) if from_client_msg.decode('utf-8') == 'byebye': break to_client_msg = input('来自服务端说:') conn.send(to_client_msg.encode('utf-8'))
tcp客户端
import socket client = socket.socket() client.connect(('127.0.0.1',8001)) while 1: to_server_msg = input('客户端说:') client.send(to_server_msg.encode('utf -8')) if to_server_msg == 'byebye': break from_sever_msg = client.recv(1024) print('来自服务端的消息:',from_sever_msg.decode('utf-8')) client.close()
2.udp协议下的socket通讯流程图片:
udp一个服务端对应一个客户端的:
一个服务端:
import socket udp_server = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8002) udp_server.bind(ip_port) from_client_msg,client_add = udp_server.recvfrom(1024) udp_server.sendto(b'gunduzi',client_add)
一个客户端:
import socket udp_client = socket.socket(type=socket.SOCK_DGRAM) ip_port =('127.0.0.1',8002) udp_client.sendto(b'hello',ip_port) from_server_msg,server_addr = udp_client.recvfrom(1024) print(from_server_msg,server_addr)
udp一个服务端对应多个客户端的:
服务端:
import socket udp_server = socket.socket(type=socket.SOCK_DGRAM) ip_port =('127.0.0.1', 8002) udp_server.bind(ip_port) while 1: from_client_msg, client_addr = udp_server.recvfrom(1024) print(from_client_msg.decode('utf-8'),client_addr) to_client_msg = input('服务端说:') udp_server.sendto(to_client_msg.encode('utf-8'),client_addr) ##填写地址是区分一下你对应的端口
客户端:
import socket udp_client = socket.socket(type=socket.SOCK_DGRAM) ip_port = ('127.0.0.1',8002) while 1: to_server_msg = input("客户端说;") udp_client.sendto(to_server_msg.encode('utf-8'), ip_port) from_server_msg,server_addr = udp_client.recvfrom(1024) print('服务端说:',from_server_msg.decode('utf -8'),server_addr)
这里我们列出两个简易描述socket各个参数和方法的图,
socket 类型:
socket各个方法的解释: