网络编程—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开发的主要内容,如果未能解决你的问题,请参考以下文章

基于socket开发网络调试助手

iOS开发— Socket编程

Java开发之Socket编程详解

十python开发之网络通信socket

小程序开发之socket编程 小程序直播答题开发的直播弹幕使用web socket编程

第六章 网络编程-SOCKET开发