zoukankan      html  css  js  c++  java
  • 网络编程—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 实现大文件上传

          

      

                

        

        

  • 相关阅读:
    windows cmd 中获取当前时间并输出此时间
    使用windows批处理来让git每日自动更新代码
    拒绝垃圾文章 在 ejabberd 中使用 MySQL
    IOS调试lldb命令常用,po,
    IOS 多语言本地化 完美解决方案
    [转]Xcode封装.Bundle文件
    百度地图SDK引用问题 Symbol(s) not found for architecture armv64
    loaded the "ViewController" nib but the view outlet was not set. 处理方式
    initWithFrame 和 initWithCoder
    使用IB_DESIGNABLE与IBInspectable特性实现可在视图编辑器的功能栏中设置
  • 原文地址:https://www.cnblogs.com/binyuanxiang/p/11349121.html
Copyright © 2011-2022 走看看