17 网络编程

  • 使得程序相互通信

  • 演示使用net 包进行TCPUDP 通信

互联网协议介绍

  • 互联网的核心是一系列协议,总称为互联网协议 (Internet Protocol Suite)
    • 这一系列协议规定了电脑如何连接和组网

互联网分层模型

  • 互联网的逻辑实现:

    • ![osi七层模型](E:\LearningNotes\Go\17 网络编程.assets\osi.png)
  • 互联网按照不同的模型划分为不同的分层

  • 无论按照什么模型划分:越往上的层越 靠近用户,越往下的层越 靠近硬件

物理层

  • 电脑与外界互联网通信
    • 先把电脑连接网络:使用 双绞线、光纤、无线电波 等方式
  • 实物理层:把电脑连接起来的物理手段
  • 主要是规定了网络的一些电气特性,作用是负责传送 0 和 1 的电信号

数据链路层

  • 功能:规定解读电信号的方式,确定了物理层传输的 0 和 1 的分组方式及代表意义
    • 例如:多少电信号算一组?每个信号位有何意义
  • 以太网 (Ethernet) 的协议占据了主导地位
  • 以太网 规定,一组电信号构成一个数据包,叫做 帧Frame
    • 一个帧标头Head数据Data 组成
    • 标头 :包含数据包的一些说明项:如发送者、接收者、数据类型等
      • 长度:固定 18 字节
    • 数据 :数据包的具体内容
      • 长度:最短 46 字节,最长 1500 字节
    • 若数据很长,必须分割成多个帧发送
  • 标识 发送者 和 接收者:
  • 以太网协议 规定:连入网络的所有设备 必须具有 网卡接口
    • 数据包必须是从一块网卡,传送到另一块网卡
    • 网卡地址,就是数据包的发送地址和接收地址,这就是MAC地址
  • 每块网卡拥有独一无二的MAC地址,长度是 48 个二进制位,通常用 12 个十六进制数表示
    • 前 6 个十六进制数 是厂商编号
    • 后 6 个是该厂商的网卡流水号
  • MAC 地址:定位网卡和数据包的路径
  • 通过 ARP 协议获取接收方的 MAC地址,
  • 以太网采用广播broadcasting 发送方式
    • 向本网络内所有计算机都发送数据包
    • 每台计算机读取这个包的 标头 ,找到接收方的MAC地址,
    • 然后与自身的MAC地址相比较,若相同就接受这个包;否则就丢弃

网络层

  • 根据以太网协议,可以依靠 MAC 地址 向外发送数据
  • 以太网采用广播方式发送数据包 重大缺陷:
    • 所有成员人手一包,不仅效率低
    • 而且发送的数据只能局限在 发送者 所在的子网络
  • 区别哪些 MAC 地址属于同一个子网络
    • 若是同一个字网络,就采用广播方式发送
    • 否则就采用路由 方式发送
  • 针对该问题,导致了网络层的诞生,
  • 网络层的作用:引进一套新的地址,区分不同的计算机是否属于同一个子网络
    • 这套地址 即网络地址,简称 网址
  • 至此,每台计算机拥有两种地址:
    • MAC 地址:将数据包 送到该子网络(网络地址确定的)中的目标网卡
      • 绑定于网卡
    • 网络地址:帮助我们确定计算机所在的子网络
      • 网络管理员分配的
    • 两者无任何联系
  • 先处理网络地址,在处理MAC地址
  • IP 协议:规定网络地址的协议
    • 所定义的地址:IP 地址
  • 目前,广泛采用 IPv4 , IP 协议第四版
    • 网络地址:32 个二进制位组成
    • 习惯用分成四段的十进制数表示 IP 地址:从0.0.0.0到255.255.255.255
  • IP 数据包:根据 IP 协议发送的数据
    • 标头:版本、长度、IP 地址
      • 长度:20 - 60字节
    • 数据:IP 数据包的具体内容
    • 整个数据包的总长度最大为 65535 字节

传输层

  • 有了 MAC 地址 和 IP 地址,可以在互联网上的 任意两台主机建立通信
  • 同一台主机上的许多程序 需要使用网络收发数据包,该如何区分数据包的归属
  • 使用参数 端口Port 表示数据包供哪个进程使用
    • Port 是每一个使用网卡的程序的编号
    • 每一个数据包都发到主机的特定端口
  • 端口 是0-65535 的一个整数,使用16 个二进制位表示
    • 0-1023 的端口被系统占用
    • 用户只能选用大于 1023 的端口
  • 有了 IP 和 端口,可以唯一确定互联网上一个程序,进而实现网络间的程序通信
  • 必须在数据包中加入 端口信息,因此需要新的协议
    • UDP 协议:在数据前加上端口号,总长度不超过65535 字节
      • 缺陷:无法确定对方是否收到
      • 标头:发出端口,接收端口
        • 8个字节
      • 数据:具体内容
    • TCP 协议:保证数据不丢失
      • 缺陷:过程复杂,实现困难,消耗较多的资源
      • 无长度限制
      • 通常长度不超过 IP 数据包的长度

应用层

  • 应用程序收到 传输层数据,需要对数据进行解包:(需要事先规定好通信的数据格式)
  • 应用层的作用:规定应用程序使用的数据格式
    • 例如:TCP协议之上的 Email,HTTP,FTP等协议
    • 这些协议组成了互联网协议的应用层
  • 发送方的HTTP 数据,经过互联网的传输过程中,会依次添加各层协议的标头信息,接收方收到数据包后, 再依次根据协议解包得到数据
    • ![HTTP数据传输图解](E:\LearningNotes\Go\17 网络编程.assets\httptcpip.png)

socket 编程

  • Socket 是 BSD UNIX 的进程通信机制,称作套接字
  • 作用:描述 IP 地址和端口,一个通信链的句柄
  • 可以理解为 TCP/IP 网络的 API ,定义了许多函数和例程,程序员可以用它们开发TCP/IP 网络上的应用程序
  • 电脑上运行的应用程序,通常通过套接字向网络发出请求或者应答请求

socket 图解

  • Socket 是应用层与TCP/IP 协议族通信的中间软件抽象层
  • 将复杂的TCP/IP 协议族 隐藏在Socket 后,
    • 用户只需调用Socket相关函数,
    • 让Socket去组织符合指定的协议数据,然后进行通信
  • ![socket图解](E:\LearningNotes\Go\17 网络编程.assets\socket.png)

Go 语言实现 TCP 通信

TCP 协议

TCP 服务端

TCP 客户端

TCP 黏包

黏包示例

为什么会出现黏包

解决办法

Go 语言实现UDP通信

UDP 协议

UDP 服务端

UDP 客户端

304301980