17 网络编程
17 网络编程
使得程序相互通信
演示使用
net
包进行TCP
和UDP
通信
互联网协议介绍
- 互联网的核心是一系列协议,总称为
互联网协议
(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 地址:将数据包 送到该子网络(网络地址确定的)中的目标网卡
- 先处理网络地址,在处理MAC地址
- IP 协议:规定网络地址的协议
- 所定义的地址:IP 地址
- 目前,广泛采用
IPv4
, IP 协议第四版- 网络地址:32 个二进制位组成
- 习惯用分成四段的十进制数表示 IP 地址:从
0.0.0.0到255.255.255.255
- IP 数据包:根据 IP 协议发送的数据
- 标头:版本、长度、IP 地址
- 长度:20 - 60字节
- 数据:IP 数据包的具体内容
- 整个数据包的总长度最大为 65535 字节
- 标头:版本、长度、IP 地址
传输层
- 有了 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
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment