网络通讯协议
Posted shenjunhui6
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络通讯协议相关的知识,希望对你有一定的参考价值。
网络通讯的基本要素
物理介质
通讯协议
物理层规定物理介质的相关规范 比如网线接口是什么样的 有几根线
问题:无法理解单纯的二进制数据
数据链路层
工作在这一层的是以太网
规定一组电信号有多少位
每一组电信号包含什么样的内容
每一台电脑必须拥有一个全球唯一的mac地址(可以有多个)
通过广播的方式来找到对方的mac地址
问题:不可能 全球广播 会造成广播风暴(广播太多 网络瘫痪)
网络层
工作在这一层的是ip地址
网络地址协议
给每一给计算机分配一个ip地址
通常是ipv4
0.0.0.0-255.255.255.255
前三段为网络号
后一段为主机号
子网掩码来判断是否处于同一个局域网
arp协议把ip转成mac地址的协议
ip协议主要的目的就是 找到全球范围内的某一个局域网存在某一台具体的计算机
问题:一个数据包到达对方计算机后到底交给哪个应用程序来处理
传输层
TCP UDP
用于规范数据传输方式,以及识别应用程序(端口号)
TCP:可靠,效率低 因为其需要不断的发送确认信息
适用于:对数据完整性高的程序 比如支付数据 文字信息
UDP:不可靠传输,效率高于TCP 完全不关心 对方是否收到数据发送到网络中就完事
适用于:视频聊天 语音 即时对战游戏
相当于对讲机 bp机
应用层
主要用于规定双方应用程序之间以什么形式来传输数据
这一层的数据形式是有程序员自己制定的常见有HTTP FTP EMAIL等等
socket
封装了传输层一堆协议的模块
什么时候使用
当你需要开发一款 C/S架构的应用程序的时候 就需要它
基于C/S架构的应用程序 需要分别开发服务器和客户端程序
学习的重点就是 如何使用socket编写服务器程序以及如何使用socket编写客户端程序
通常应该先开发服务器
基于TCP的socket服务器.py
import socket
‘‘‘
1.买一个手机
2.买一个手机卡
3.开机待机
4.接通电话
5.唠嗑
6.挂电话
7.关机
‘‘‘
# 1.买一个手机
# 默认情况下创建的是基于强罗的TCP协议的socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 参数1:协议家族 网络的为AF_INET
# 参数2:type 用于设置采用的传输协议 TCP的为SOCK_STREAM UDP的为SOCK_DGRAM
# 其余参数默认即可
# 端口号取值 0-65535 0-1023 是系统保留的
# 重用端口号当你已经关闭了服务器 但是还是报异常说 端口占用 时 可以使用
s.setsockopt()
s.bind((‘192.168.14.56‘, 8006))#也是一个阻塞的函数会一直等到
s.listen() # 监听客户端的连接
# c_client 当接收到请求时会返回一个表示客户端的socket对象
# 客户端的socket对象就负责 这个客户端的数据收发
# c_address同时返回对方的ip和端口 打包成元组
c_client, c_address = s.accept() # 接收客户端的连接请求 该函数会阻塞 直到有连接
# 开始收发数据
# recv接收数据
# buffersize缓冲区大小
data = c_client.recv(1024)
print(data)
# 断开与这个客户端的连接
c_client.close()
# 关闭服务器 socket 后续的客户端就无法子啊连接到服务器了
# 一般正常服务器时不关的
s.close() # 关机
‘‘‘
服务器程序的大致流程
1.创建socket独享
2.绑定ip和port
3.监听连接
4.接受请求
5.接收数据
6.断开连接
‘‘‘
基于TCP的socket客户端.py
import socket
# 创建socket对象
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 与服务器创立连接 传入服务器的ip和端口
c.connect((‘127.0.0.1‘, 8006))
# 收发数据 只能发送bytes类型的数据(任何数据都能发)
c.send(‘hello‘.encode(‘utf-8‘))
# 断开与服务器来连接
c.close()
改良版
改良版服务器.py
import socket
s = socket.socket()
s.bind((‘127.0.0.1‘, 8888))
s.listen()
while True:
c, address = s.accept()
print(‘收到请求‘)
while True:
try:
data = c.recv(1024)
if not data:
print(‘客户端下线了!‘)
break
print(‘收到一个数据‘, data.decode(‘utf-8‘))
data += b‘dsb‘
c.send(data)
except ConnectionResetError:
print(‘对方异常断开连接!‘)
break
改良版客户端.py
import socket
s = socket.socket()
s.connect((‘127.0.01‘, 8888))
while True:
res = input(‘>>>(退出):‘).strip()
if res == ‘q‘:
break
if not res:
continue
s.send(res.encode(‘utf-8‘))
data = s.recv(1024)
print(data)
以上是关于网络通讯协议的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装
Flutter 报错 DioError [DioErrorType.DEFAULT]: Bad state: Insecure HTTP is not allowed by platform(代码片段