Loading

网络编程(python)

网络基础

数据传输流程 服务端数据通过服务端软件 ->服务端操作系统 ->服务端计算机硬件 ->
客户端的计算机硬件 -> 客户端操作系统-_> 客户端软件

计算机网络体系结构分层
七层模型:
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层

网络应用开发架构

C/S架构 客户端/服务端
    client  客户端
    server 服务端
B/S
    Browser 浏览器
    server 服务端
统一程序入口

B/S和C/S架构的关系
    BS架构 需要安装浏览器
    CS架构 需知安装客户端
    B/S架构是特殊的C/S架构
  • arp协议 广播(交换机给每台链接的机器发送询问报文 如果找到该IP地址会单独发送给交换机叫做
    单播(发送给交换机 此时交换机就知道这个接口的ip地址)

  • 网卡的唯一标识
    mac地址(物理地址) 全球唯一

  • TCP/IP分层模型:
    应用层
    客户端
    传输层UDP/TCP
    TCP协议
    可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,
    通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
    UDP协议
    不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
    网络层IP Ip协议---arp协议
    一:首先通过ip地址和子网掩码区分出自己所处的子网
    二:分析172.16.10.10/24与172.16.10.11/24处于同一网络(如果不是同一网络,那么下表中目标ip为172.16.10.1,通过arp获取的是网关的mac)
    三:这个包会以广播的方式在发送端所处的子网内传输,所有主机接收后拆开包,发现目标ip为自己的,就响应,返回自己的mac
    数据链路层 电信号的分组方式(以太网协议)
    物理层(光缆电缆双绞线 无线电波)

  • 端口范围 0-65535
    0-1023 为系统占用端口

Socket模块

  • TCP协议
    没有传输限制 发送完接收后算一次传输
  • UDP协议
    有传输限制不可靠协议 只管发送接收不到我不管
    socket.socket(
    family="
    指定ip版本
    IPV4 AF_INET
    IPV6 AF_INET6
    ",
    type=
    "SOCK_STREAM TCP协议
    SOCK_DGRAM UDP协议",
    )

TCP:C/S架构案例

服务端案例(
import socket
HOST = "192.168.1.3"
PORT = 8000
sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_server.bind((HOST, PORT)) #绑定id地址端口
sock_server.listen(1) # 开始监听1代表允许一个连接排队有一个连接排队
conn, addr = sock_server.accept()
# conn链接对象 addr链接地址
# 阻塞状态直到有链接请求位置 有了一个新连接进来后,就会为这个请求生成一个连接对象
while True:
data = conn.recv(1024)
# 参数 每次接受多少字节
print(data.decode())
if not data:
conn.close()
break
)
客户端案例(
import socket
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
try:
client.connect(("192.168.1.3", 8000))
client.send(b"my name is kyle") # 发送空数据发不出去
client.close() # 断开链接
except ConnectionRefusedError:
print("服务端未开启")

)

粘包问题(

如果想要接受一批数据  而下一批数据也要在第一批接受之后随后接受  此时你在使用之前的 recv(1024)字节就会出现粘包现象
[当最后一段数据接收时如果少于1024 那么它会把第二批数据接受补充至1024]
此时数据面临不安全
解决方法(
    C/S相互发送数据时 第一句发送报文将后面数据的大小发给 接受者 此时接受者拿到数据大小就可进行处理
    处理方法
    总大小每次减去接受的大小 如果总大小少于接受的大小就把总大小变成接受的大小 这就是解决方法
)

)

UDP C/S方法

  • 发送限制
    MacOS 发送buffer长度限制:10249 = 9216 Bytes
    CentroOS 发送buffer长度限制: 1024
    64 - 28=65507 Bytes (推测应该介于55467-65507之间,取决于IP头部长度,如果IP头部长度>最小值20,带了附加头信息的话,支持长度应该会减少)

{

  • 创建udp对象
    server = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
    clicent = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)

  • 发送
    clicent.sendto(数据, (ip地址,端口))

  • 接受数据
    server.recvform()大小

接收长度大于数值时不可接收发送
}

  • gethostname()获取主机名
  • gethostbyname_ex(hostname) 通过主机名获得相同名字的ip地址
posted @ 2021-08-21 13:24  guxuanyan  阅读(68)  评论(0)    收藏  举报