8. 网络编程

python基础之socket编程

1. osi七层协议

1.1 数据链路层

  1. 数据链路层定义了电信号的分组方式(0和1序列多少位一组,每组什么意思)及数据发送方式
  2. Ethernet规定接入internet的设备都必须具备网卡及mac地址:12位16进制数表示(6位厂商编号 + 6位流水线号)
  3. Ethernet规定数据帧格式:可分为报头head(固定18个字节)和data(46 - 1500字节)两部分:

1.2 网络层

ipv4:32位2进制表示:0.0.0.0-255.255.255.255。ip数据包直接放入最长1500字节的以太网帧data部分,封装上以太网头后通过以太网协议发送。head(20 - 60字节);data:最长为65,515字节。如果IP数据包超过1500字节,就要分割成几个以太网数据包分开发送。

ARP协议:处于同一子网,广播目的MAC:FFFF:FFFF:FFFF,目标主机响应并返回自己的MAC,否则arp查询网关mac使用路由方式发送

1.3 传输层

传输层:建立端口到端口的通信,端口范围(0-65535,0-1023为系统占用端口)用来标识主机上的应用程序。
TCP:可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
UDP:不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

1.4 应用层

应用层:规定应用程序的数据格式。TCP协议可以为各种各样的程序传递数据,另有不同协议规定电子邮件、网页、FTP等应用数据的格式,这些应用程序协议就构成了应用层。发送数据是一个封装的过程,而接收数据则是接封装。
C/S架构的软件(软件属于应用层)基于网络通信,使用socket就是为了完成C/S架构的开发

1.5 例: DHCP动态获取ip配置信息

DHCP Request:
1. 以太网帧头:设置本机的MAC地址和接收方(DHCP服务器此时不知道,广播查找:FF-FF-FF-FF-FF-FF)的MAC地址。
2. IP包头:源IP设为0.0.0.0,目的IP设为255.255.255.255。据此DHCP服务器知道这个包是发给我的,而其他计算机丢弃这个包。
3. UDP头:DHCP协议规定,发出方68端口,接收方67端口。

DHCP Reply:
1. 以太网帧头:目的MAC:PC,源MAC:DHCP服务器网卡地址
2. IP包头:源IP:DHCP服务器IP地址;目的IP:255.255.255.255
3. UDP头:源端口:67;目的端口68,分配给请求端的IP地址和本网络的具体参数则包含在Data部分。

2. socket层

socket常译为套接字,起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种”打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个”文件”,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

socket是在应用层和传输层之间的一个抽象层,把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。套接字有两种(或称两个种族),分别是基于文件型的和基于网络型的:

基于文件类型的套接字家族: AF_UNIX调用底层文件系统来取数据,两个套接字进程(应用程序)运行在同一机器,可以通过访问同一个文件系统间接完成通信,也称进程间通讯(IPC)。
基于网络类型的套接字家族: AF_INET使用最广泛,AF_INET6被用于ipv6

3. 套接字工作流程

一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

socket()模块函数用法

import socket
socket.socket(socket_family,socket_type,protocal=0)
# socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。

# 获取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取udp/ip套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 由于 socket 模块中有太多的属性。我们在这里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。
# 例如tcpSock = socket(AF_INET, SOCK_STREAM)

服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发�%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值