网络编程—SOCKET开发
Posted binyuanxiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程—SOCKET开发相关的知识,希望对你有一定的参考价值。
一、计算机与网络基础知识
1.1、计算机基础知识
应用软件对硬件的操作必须调用操作系统的接口,由操作系统操控硬件
客户端软件想要基于网络发送一条消息给服务端软件的流程:
1、客户端软件产生数据,存放于客户端软件的内存中,然后调用接口将自己内存中的数据发送或拷贝给操作系统内存。
2、操作系统收到数据后,按照客户端软件指定的规则(协议),调用网卡发送数据。
3、网络传输数据。
4、服务端软件调用系统接口,给操作系统发送将数据从操作系统内存拷贝到自己内存中的指令。
5、服务端操作系统收到 4 的指令后,使用与客户端相同的规则(协议),从网卡接收到数据,拷贝给服务端软件。
1.2、什么是网络
网络 = 物理链接介质 + 互联网协议
互联网协议分为 OSI 七层或 TCP/IP 五层 协议
二、TCP / IP 各层详解
2.1、物理层
功能:基于电器特性发送高低电压(电信号),高电压对应数字 1,低电压对应数字 0。
2.2、数据链路层
功能:单纯的电信号 0 和 1 没有任何意义,因此定义了电信号的分组方式,即以太网协议。
2.1.1、以太网协议( ethernet )
1、规定一组电信号构成一个数据包,叫做 ‘帧’。每一帧包含 ‘报头’ 和 ‘数据’ 两部分。
报头(18字节):发送者 / 源地址(6字节)+ 接收者 / 目标地址(6字节)+ 数据类型(6字节)
数据(46 - 1500字节)
2、mac地址
即源地址和目标地址
每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为 48 位 2 进制,通常由 12 位16进制数表示
mac地址(12位)= 6位厂商编号 + 6位流水线号
2.1.2、广播
在同一网络内一台主机通过 arp 协议获取另一台主机的 mac 地址,然后用广播方式进行通信。
2.3、网络层
功能:引入一套新的地址来区分不同的广播域 / 子网,即网络地址。
2.3.1、IP 协议
1、IP 协议定义的网络地址为 IP 地址,有 ipv4 和 ipv6 两个版本,以 ipv4 为主。一个 ipv4 的 IP 地址由 32 位 2 进制表示,通常写成四段十进制数(点分十进制)。范围:0.0.0.0 - 255.255.255.255
2、IP 协议是TCP / IP 协议的核心,所有TCP、UDP 的数据都以 IP 数据格式传输。IP 协议由于没有提供一种数据未传达以后的处理机制,所以是不可靠的协议。
3、IP 数据包最大长度为 65535 个字节,因为在 IP 数据报中用 2 个字节描述数据长度。最多描述 2 的 16 次方。
2.3.2、子网掩码
1、表示子网络特征的一个参数,形式上等同于IP地址,也是 32 位 2 进制,网络部分全为 1,主机部分全为 0。
2、作用:结合 IP 地址一起使用,标识一个 IP 地址哪些位代表网络位,哪些位代表主机位。
2.3.3、IP 地址分类
1、A 类地址:1 字节网络地址 + 3 字节主机地址。范围从 1.0.0.0 到 126.0.0.0,可用的 A 类网络有126个,每个网络能容纳 1 亿多个主机
2、B 类地址:2 字节网络地址 + 2 字节主机地址。范围从128.0.0.0 到 191.255.255.255,可用的 B 类网络有 16382 个,每个网络能容纳 6 万多个主机
3、C 类地址:3 字节网络地址 + 2 字节主机地址。范围从192.0.0.0 到 223.255.255.255,可用的 C 类网络有 209万余 个,每个网络能容纳 254 个主机
4、D 类地址:多用于多点广播,是一个专门保留的地址。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。范围从 224.0.0.0 到 239.255.255.255
5、E 类地址:为将来使用保留,范围为 240.0.0.0 到 255.255.255.254
全零地址(0.0.0.0)对应于当前主机
全“1”地址(255.255.255.255)是当前子网的广播地址
回环地址(127.0.0.1)又称为本机地址,调用了回环接口。
1、传给回环地址的任何数据均作为 IP 输入
2、任何传给该主机 IP 地址的数据均送到环回接口。
3、传给广播地址或多播地址的数据报会复制一份传给回环接口,然后送到以太网上。这是因为广播传送和多播传送的定义包含主机本身
2.3.4、ARP 协议
功能:广播的方式发送数据包,获取目标主机的 mac 地址
工作方式:
1、通过 IP 地址和子网掩码区分出自己所处的子网
2、分析主机地址和目标地址是否处于同一网络,如果不是,获取对方网关的 mac。
3、这个包会以广播的方式在发送端所处的子网内传输,所有主机接收后拆开包,发现目标 IP 是自己的就响应,返回自己的 mac。
2.3.5、ICMP 协议
功能:当传送 IP 数据包发生错误,比如主机不可达、路由不可达等,ICMP 协议会把错误信息封包,传送回主机,给主机处理错误的机会。
基于 ICMP 协议的工具有 ping 和 traceroute。
1、ping
利用 ICMP 协议包侦测另一个主机是否可达。原理是用类型码为 0 的 ICMP 发请求,收到请求的主机用类型码为 8 的 ICMP 回应。ping 程序来计算间隔时间和送达包的数量。
用户就能大致判断网络情况
2、traceroute
查看从当前主机到某地址一共经过多少路由。
2.4、传输层
端口:应用程序和网卡关联的编号,范围为 0 - 65535,0 - 1023 为系统占用
传输层功能:通过 TCP 和 UDP 协议建立端口到端口的通信
2.41、TCP 协议
1、TCP 数据包没有长度限制,理论上可以无限长,单位了保证网络效率,通常不超过 IP 数据包的长度,以确保单个 TCP 数据包不被分割。
2、可靠传输:只要不得到确认,就重新发送数据,直到收到对方的确认。
3、连接时“三次握手”,断开时“四次挥手”
4、相对 UDP 协议网络开销大
2.4.2、UDP 协议
1、不可靠传输
2、UDP自带8字节报头
3、网络开销小。
三、UDP数据包大小问题
1、在数据链路层,数据帧除去首尾的 18 字节,数据部分的最大长度(MTU)为1500字节。
2、在网络层,IP 包的首部占用 20 字节,这里的 MTU 为 1480 字节。
3、在传输层,UDP 包的首部占用 8 字节,这里的 MTU 为 1472 字节。
4、在应用层,生成的 UDP 数据不要超过 1472 字节。超过时,IP数据包会分片传输, 当某一片数据丢失,UDP数据将全部丢弃。
四、socket模块
socket 是应用层与传输层中间的抽象层,是一组接口。把复杂的 TCP / IP 协议族隐藏在 socket 接口后面。调用该接口,即可给其他机器发送消息。
4.1、socket 套接字常用方法
socket.socket(family=AF_INET, type=SOCK_DTREAM, proto=0, fileno=None)
4.1.1、socket type 类型
TCP的 type 类型为 socket.SOCK_STREAM
UDP的 type 类型为 socket.SOCK_DGRAM
4.1.2、服务端套接字函数
1、s.bind() 绑定(主机、端口号)到套接字
2、s.listen() 开始 TCP 监听
3、s.accept() 被动接受 TCP 客户的连接,(阻塞式)等待连接的到来
4.1.3、客户端套接字函数
1、s.connect() 主动初始化 TCP 服务器连接
2、s.connect_ex() connect() 函数的扩展版本出错时返回出错码,而不是抛出异常
4.1.4、公共用途的套接字函数
1、s.recv() 接收数据
2、s.send() 发送数据(待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
3、s.sendall() 发送完整的 TCP 数据,(本质是循环调用 send(),在待发送数据量大于己端缓存区剩余空间时,数据不会丢失,循环调用 send()直到发完)
4、s.recvfrom()
5、s.getpeername() 连接到当前套接字的远端地址
6、s.close() 关闭套接字
7、s.setblocking()
8、s.getaddrinfo()
9、s.getfqdn()
10、s.gethostbyname()
4.2、粘包现象
4.2.1、原因:
每次发送数据时,都要把数据从 socket 客户端程序复制一份到缓存区。为了提高传输效率,发送方往往收集到足够多的数据后一次性发送给对方。T一、计算机与网络基础知识
1.1、计算机基础知识
应用软件对硬件的操作必须调用操作系统的接口,由操作系统操控硬件
客户端软件想要基于网络发送一条消息给服务端软件的流程:
1、客户端软件产生数据,存放于客户端软件的内存中,然后调用接口将自己内存中的数据发送或拷贝给操作系统内存。
2、操作系统收到数据后,按照客户端软件指定的规则(协议),调用网卡发送数据。
3、网络传输数据。
4、服务端软件调用系统接口,给操作系统发送将数据从操作系统内存拷贝到自己内存中的指令。
5、服务端操作系统收到 4 的指令后,使用与客户端相同的规则(协议),从网卡接收到数据,拷贝给服务端软件。
1.2、什么是网络
网络 = 物理链接介质 + 互联网协议
互联网协议分为 OSI 七层或 TCP/IP 五层 协议
二、TCP / IP 各层详解
2.1、物理层
功能:基于电器特性发送高低电压(电信号),高电压对应数字 1,低电压对应数字 0。
2.2、数据链路层
功能:单纯的电信号 0 和 1 没有任何意义,因此定义了电信号的分组方式,即以太网协议。
2.1.1、以太网协议( ethernet )
1、规定一组电信号构成一个数据包,叫做 ‘帧’。每一帧包含 ‘报头’ 和 ‘数据’ 两部分。
报头(18字节):发送者 / 源地址(6字节)+ 接收者 / 目标地址(6字节)+ 数据类型(6字节)
数据(46 - 1500字节)
2、mac地址
即源地址和目标地址
每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为 48 位 2 进制,通常由 12 位16进制数表示
mac地址(12位)= 6位厂商编号 + 6位流水线号
2.1.2、广播
在同一网络内一台主机通过 arp 协议获取另一台主机的 mac 地址,然后用广播方式进行通信。
2.3、网络层
功能:引入一套新的地址来区分不同的广播域 / 子网,即网络地址。
2.3.1、IP 协议
1、IP 协议定义的网络地址为 IP 地址,有 ipv4 和 ipv6 两个版本,以 ipv4 为主。一个 ipv4 的 IP 地址由 32 位 2 进制表示,通常写成四段十进制数(点分十进制)。范围:0.0.0.0 - 255.255.255.255
2、IP 协议是TCP / IP 协议的核心,所有TCP、UDP 的数据都以 IP 数据格式传输。IP 协议由于没有提供一种数据未传达以后的处理机制,所以是不可靠的协议。
3、IP 数据包最大长度为 65535 个字节,因为在 IP 数据报中用 2 个字节描述数据长度。最多描述 2 的 16 次方。
2.3.2、子网掩码
1、表示子网络特征的一个参数,形式上等同于IP地址,也是 32 位 2 进制,网络部分全为 1,主机部分全为 0。
2、作用:结合 IP 地址一起使用,标识一个 IP 地址哪些位代表网络位,哪些位代表主机位。
2.3.3、IP 地址分类
1、A 类地址:1 字节网络地址 + 3 字节主机地址。范围从 1.0.0.0 到 126.0.0.0,可用的 A 类网络有126个,每个网络能容纳 1 亿多个主机
2、B 类地址:2 字节网络地址 + 2 字节主机地址。范围从128.0.0.0 到 191.255.255.255,可用的 B 类网络有 16382 个,每个网络能容纳 6 万多个主机
3、C 类地址:3 字节网络地址 + 2 字节主机地址。范围从192.0.0.0 到 223.255.255.255,可用的 C 类网络有 209万余 个,每个网络能容纳 254 个主机
4、D 类地址:多用于多点广播,是一个专门保留的地址。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。范围从 224.0.0.0 到 239.255.255.255
5、E 类地址:为将来使用保留,范围为 240.0.0.0 到 255.255.255.254
全零地址(0.0.0.0)对应于当前主机
全“1”地址(255.255.255.255)是当前子网的广播地址
回环地址(127.0.0.1)又称为本机地址,调用了回环接口。
1、传给回环地址的任何数据均作为 IP 输入
2、任何传给该主机 IP 地址的数据均送到环回接口。
3、传给广播地址或多播地址的数据报会复制一份传给回环接口,然后送到以太网上。这是因为广播传送和多播传送的定义包含主机本身
2.3.4、ARP 协议
功能:广播的方式发送数据包,获取目标主机的 mac 地址
工作方式:
1、通过 IP 地址和子网掩码区分出自己所处的子网
2、分析主机地址和目标地址是否处于同一网络,如果不是,获取对方网关的 mac。
3、这个包会以广播的方式在发送端所处的子网内传输,所有主机接收后拆开包,发现目标 IP 是自己的就响应,返回自己的 mac。
2.3.5、ICMP 协议
功能:当传送 IP 数据包发生错误,比如主机不可达、路由不可达等,ICMP 协议会把错误信息封包,传送回主机,给主机处理错误的机会。
基于 ICMP 协议的工具有 ping 和 traceroute。
1、ping
利用 ICMP 协议包侦测另一个主机是否可达。原理是用类型码为 0 的 ICMP 发请求,收到请求的主机用类型码为 8 的 ICMP 回应。ping 程序来计算间隔时间和送达包的数量。
用户就能大致判断网络情况
2、traceroute
查看从当前主机到某地址一共经过多少路由。
2.4、传输层
端口:应用程序和网卡关联的编号,范围为 0 - 65535,0 - 1023 为系统占用
传输层功能:通过 TCP 和 UDP 协议建立端口到端口的通信
2.41、TCP 协议
1、TCP 数据包没有长度限制,理论上可以无限长,单位了保证网络效率,通常不超过 IP 数据包的长度,以确保单个 TCP 数据包不被分割。
2、可靠传输:只要不得到确认,就重新发送数据,直到收到对方的确认。
3、连接时“三次握手”,断开时“四次挥手”
4、相对 UDP 协议网络开销大
2.4.2、UDP 协议
1、不可靠传输
2、UDP自带8字节报头
3、网络开销小。
三、UDP数据包大小问题
1、在数据链路层,数据帧除去首尾的 18 字节,数据部分的最大长度(MTU)为1500字节。
2、在网络层,IP 包的首部占用 20 字节,这里的 MTU 为 1480 字节。
3、在传输层,UDP 包的首部占用 8 字节,这里的 MTU 为 1472 字节。
4、在应用层,生成的 UDP 数据不要超过 1472 字节。超过时,IP数据包会分片传输, 当某一片数据丢失,UDP数据将全部丢弃。
四、socket模块
socket 是应用层与传输层中间的抽象层,是一组接口。把复杂的 TCP / IP 协议族隐藏在 socket 接口后面。调用该接口,即可给其他机器发送消息。
4.1、socket 套接字常用方法
socket.socket(family=AF_INET, type=SOCK_DTREAM, proto=0, fileno=None)
4.1.1、socket type 类型
TCP的 type 类型为 socket.SOCK_STREAM
UDP的 type 类型为 socket.SOCK_DGRAM
4.1.2、服务端套接字函数
1、s.bind() 绑定(主机、端口号)到套接字
2、s.listen() 开始 TCP 监听
3、s.accept() 被动接受 TCP 客户的连接,(阻塞式)等待连接的到来
4.1.3、客户端套接字函数
1、s.connect() 主动初始化 TCP 服务器连接
2、s.connect_ex() connect() 函数的扩展版本出错时返回出错码,而不是抛出异常
4.1.4、公共用途的套接字函数
1、s.recv() 接收数据
2、s.send() 发送数据(待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
3、s.sendall() 发送完整的 TCP 数据,(本质是循环调用 send(),在待发送数据量大于己端缓存区剩余空间时,数据不会丢失,循环调用 send()直到发完)
4、s.recvfrom()
5、s.getpeername() 连接到当前套接字的远端地址
6、s.close() 关闭套接字
7、s.setblocking()
8、s.getaddrinfo()
9、s.getfqdn()
10、s.gethostbyname()
五、粘包现象
5.1、原因:
每次发送数据时,都要把数据从 socket 客户端程序复制一份到缓存区。为了提高传输效率,发送方往往收集到足够多的数据后一次性发送给对方。这样
对方就会收到粘包数据。问题在于接收方不知道消息之间的界限,不知道一次该提取多少字节,造成接收数据错乱。
5.2、粘包问题只存在于TCP中
1、TCP协议是面向流的协议,应用程序看到的数据是一个整体,或者说是一个流。无法判断数据间的界限。因此容易出现粘包问题。必须提供科学的拆包机制。
2、UDP 协议是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节数据。
3、TCP 是基于数据流的,于是收发的消息不能为空,这就需要在客户端和服务端都添加空消息的处理机制,防止程序卡住。而 UDP 是基于数据报的,即便是
输入空内容,也不是空消息,UDP协议会自动封装上消息头。
5.3、粘包问题解决方法:借助于 struct 模块。
六、通过 socket 实现大文件上传
以上是关于网络编程—SOCKET开发的主要内容,如果未能解决你的问题,请参考以下文章