博客
关于我
python3.6入门到高阶(全栈) day027 网络通信协议 osi七层模型
阅读量:797 次
发布时间:2023-03-08

本文共 2744 字,大约阅读时间需要 9 分钟。

网络通信原理及TCP/IP协议模型

互联网的本质就是一系列网络协议的集合,统称为互联网协议。这些协议定义了计算机如何接入互联网以及如何进行通信。

互联网协议根据功能的不同,可以按照OSI七层模型或TCP/IP五层模型进行划分。以下从底层到上层逐一阐述各层的功能。

TCP/IP五层协议模型

1. 物理层

孤立的计算机之间要想互相通信,首先需要完成组网。物理层的主要功能是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0。

2. 数据链路层

单纯的电信号0和1没有任何意义,必须规定电信号的分组方式。以太网协议(Ethernet)定义了电信号的分组方式。每个数据包称为帧,其中报头包含源Mac地址、目标Mac地址和数据类型,数据部分的长度最短为64字节,最长为1518字节。超过最大限制的数据包会被分片发送。

以太网通信采用广播方式,计算机发送数据包时,会在自己的子网内进行广播传输。接收方检查数据包中的目标IP地址是否为自身,如果是,则返回对应的Mac地址。

3. 网络层

为了应对互联网的扩展性问题,网络层引入了IP协议。IP地址用于区分不同的子网,通过子网掩码和AND运算确定是否在同一个子网内。IP数据包的头部包含源IP地址和目标IP地址,数据部分直接放入以太网数据包中。

如果不在同一个子网内,目标IP地址会被替换为网关的Mac地址。arp协议通过广播请求目标主机的Mac地址,并返回网关的Mac地址。

4. 传输层

网络层的IP协议帮助我们区分子网,以太网层的Mac地址帮助我们找到特定的主机,但这还不够。程序之间的通信需要借助传输层的端口来建立连接。TCP协议定义了面向连接的通信,通过三次握手建立连接,确保数据可靠传输。UDP协议则提供了无连接的通信服务,适用于实时性要求高的场景。

5. 应用层

应用层定义了应用程序数据的格式。例如,TCP协议支持多种应用,如Email、WWW、FTP等。这些应用程序协议共同构成了应用层,使得不同应用程序能够与网络进行通信。

socket编程实例

TCP协议下的socket实现

服务端

import socket# 创建socket对象server = socket.socket(socket.SOCK_STREAM)ip_port = ("192.168.15.73", 8520)server.bind(ip_port)server.listen(3)while True:    conn, addr = server.accept()    info = "服务端提供服务"    conn.sendall(info.encode("utf-8"))        while True:        recv_msg = conn.recv(1024).decode("utf-8")        if recv_msg == "88":            break        send_msg = input("服务端输入信息: ")        conn.sendall(send_msg.encode("utf-8"))    conn.close()server.close()

客户端

import socketclient = socket.socket(socket.SOCK_STREAM)ip_port = ("192.168.15.73", 8520)client.connect(ip_port)while True:    info = input("客户端输入请求: ")    if info == "88":        break    client.sendall(info.encode("utf-8"))    recv_msg = client.recv(1024).decode("utf-8")    print("收到:", recv_msg)client.close()

UDP协议下的socket实现

服务端

import socketserver = socket.socket(socket.SOCK_DGRAM)ip_port = ("127.0.0.1", 8520)server.bind(ip_port)while True:    recv_msg, addr = server.recvfrom(1024)    print("收到来自{}的消息:{}".format(addr, recv_msg.decode("utf-8")))    send_msg = input("输入回复内容: ")    if not send_msg:        continue    server.sendto(send_msg.encode("utf-8"), addr)

客户端

import socketclient = socket.socket(socket.SOCK_DGRAM)client.sendto("给你商城的信息".encode("utf-8"), ("127.0.0.1", 8520))while True:    recv_msg, addr = client.recvfrom(1024)    print("收到来自服务端的消息:", recv_msg.decode("utf-8"))    who = input("请选择聊天对象[Q退出]: ")    if who == "Q":        break    ip_port = ("192.168.12.42", 8520)  # 假设多个聊天对象    while True:        send_msg = input("输入聊天内容[Q结束]: ")        if send_msg == "Q":            break        if not send_msg:            continue        client.sendto(send_msg.encode("utf-8"), ip_port)        recv_msg, addr = client.recvfrom(1024)        print("收到来自{}的消息:{}".format(addr, recv_msg.decode("utf-8")))

UDP协议下的聊天工具

以上代码可以实现简单的UDP聊天工具,支持多个聊天对象。服务端接收客户端消息并反馈,客户端可以选择不同的聊天对象进行对话。

转载地址:http://tylfk.baihongyu.com/

你可能感兴趣的文章
python基础之---语句
查看>>
python基础之---正则表达式
查看>>
python基础之---函数式编程
查看>>
python基础之---函数
查看>>
Python基础之(一)基本数据类型
查看>>
Python基础【os】
查看>>
Python基础——面向对象
查看>>
Python基础——线程锁
查看>>
python基础——线程与进程
查看>>
Python基础——_thread多线程
查看>>
Python基础——Thread类与线程对象
查看>>
Python基础——Thread创建管理多线程
查看>>
Python基础——MySQL数据库基本操作
查看>>
Python基础_列表 list
查看>>
python基础---->常用模块
查看>>
Python基础(2):控制结构
查看>>
Python基础 | 关于“循环”那些事
查看>>
python系列【仅供参考】:python 远程rdp
查看>>
python基于flask搭建http服务(四)—— Docker容器化部署
查看>>
Python块键盘/鼠标输入
查看>>