网络通信
本文整理自书籍《网络是怎样连接的(图灵程序设计丛书)》,包括部分图片,剩余部分整理自网络。
以太网的3个基本性质:
(1)将包发送到MAC头部的接收方MAC地址表示的目的地;
(2)用发送方的MAC地址识别发送方;
(3)用以太类型识别包的内容
一、网络通信流程总述
通常所谓的网络通信是客户端和服务器之间交换信息的过程,两端经由 应用程序、网络协议栈、网卡驱动、网卡硬件 以及中间的 路由器、交换机 等设备完成信息交换,在两端(客户端、服务器,即计算机)上获取(/显示)信息到交换网络数据结构图示如下:
Socket库——用于调用网络功能的程序组件集合。是加州大学伯克利分校开发的BSD操作系统中开发的C语言库,后来其他操作系统也按照这个标准开发了相应的网路库,可以说,Socket库是网络开发中的一种标准库
!
二、应用程序部分(以浏览器为例)
浏览器的工作内容:
1)解析URL;
2)用HTTP协议访问Web服务器
1、网址(URL,Uniform Resource Locator,统一资源定位符)
格式:协议名://用户名(可省略):密码(可省略)@相应服务器的域名:端口号(可省略)文件的路径名(可省略)
Eg:
1、HTTP协议
http://user:password#www.glasscom.com:80/dir/file1.html
2、ftp协议
ftp://user:passwd@ftp.glasscom.com:21/dir/file1.html
3、读取本地文件
file://localhost/c:/path/file1.zip
URL元素说明:
1)协议名,表示访问数据源(Eg: http:);
2)省略文件名的情况
a、【Eg:http://www.lab.glasscom.com/dir/】——我们会事先在服务器上设置好默认的文件名,大多数情况下是index.html或default.html;
b、【Eg: http://www.lab.glasscom.com/】——访问index.html或default.html;
c、【Eg: http://www.lab.glasscom.com】——此时访问根目录下实现设置的默认文件,一般就是/index.html或/default.html;
d、【Eg: http://www.lab.glasscom.com/whatisthis】——这种情况下whatisthis本来应该是文件,但使用者有可能会用成目录,这个是可以访问到wahtisthis目录的!
2、DNS域名解析
见本人博文:
3、Socket套接字
构建连接——收发两端 各创建一个套接字,相当于两个套接字之间有一个管道。当双方套接字连接起来以后,通信准备完成。
断开连接——可以由客户端、服务器任意一方发起,一方断开后,另一方也会随之断开,随后套接字会被删除!
收发数据的操作过程:
1)创建套接字——创建完成后,协议栈会返回一个描述符,这个描述符用来识别不同的套接字;
2)将管道连接到服务器端的套接字——调用connect程序组件完成这一操作;
3)收发数据;
4)断开管道并删除套接字。
套接字的识别:
计算机内——用套接字描述符识别;
计算机外——用对端IP+端口号识别。
套接字连接的实质:通信双方交换各自的控制信息
控制信息可分为:
1)通信双方交换的控制信息(数据包头部);
2)保存在套接字中,用来控制协议栈操作的信息。
socket收发消息操作过程:
三、网络协议部分
网络协议栈分为上下两部分:
1)上半部分(有两块):
a、负责用TCP协议收发数据的部分
b、负责用UDP协议收发数据的部分
2)下半部分:
用IP协议控制网络包收发操作的部分
1、TCP模块
在TCP建立连接的过程中会将SYN传给对方(这是用一个随机数计算出的初始值)
还有一个设置序号的字段,这个字段的只就代表序号的初始值
================================================================
ACK号由接收方通过SYN和其字段数据计算出ACK号
================================================================
TCP会按照网络包的大小对数据进行拆分
在得到另一端的ACK信号前,发送过的包都会保存在发送缓冲区中,如果没收到对应的ACK信号,就重新发包
TCP会在尝试重传几次无效后强制结束通信,并向应用程序报错!
ACK号的等待时间会根据网络通畅情况动态调整
================================================================
TCP一收一发效率太低,为了不在发送后干等,采用滑动窗口方式管理收发过程
窗口大小 一般和接收方的缓冲区大小一致。
================================================================
更新窗口大小的时机——接收方从缓冲区中取出数据传递给应用程序的时候。
================================================================
- SYN——序号位,同步标志
该标志仅在三次握手建立TCP连接时有效
,它提示TCP连接的服务端检查序列编号。 - ACK——应答位,确认标志
大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。 - FIN——结束标志
带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。
2、IP模块
IP模块会在网络包前面添加(1) IP 头部、(2)以太网的 MAC 头部 后发送网络包
关于IP地址(Internet Protocol Address, 互联网协议地址):
长度——32bit
关于MAC地址(Media Access Control Address,媒体访问控制地址):
长度——48bit
设置——两种方法:
1)MAC 地址是在网卡生产时写入 ROM 里的,操作系统启动时,对网卡进行初始化时,才会读取MAC地址,存入系统内存;
2)网卡驱动程序也可以不从网卡ROM中读取地址,而是
a、将配置文件中设定的MAC地址取出,放入内存;
b、从命令获取MAC地址。
【真正生效的是网卡驱动进行初始化时在MAC模块中设置的那个MAC地址】
MAC地址的格式:
关于如何从源网卡找到目标网卡:
(1)IP模块根据路由器Gateway栏的内容判断应该把包发给谁;
(2)ARP协议(Address Resolution Protocol,地址解析协议)——查询目标路由器的MAC地址;
【ARP利用广播对所有设备提问,只有目标IP地址回应,并返回其MAC地址。
前提:双方都存在于同一子网中】
(3)将ARP协议获取到的MAC地址写入MAC头部。
【为了不每次都发送ARP包,(1)我们会将查询结果放到一块叫做ARP缓存的内存空间中;
(2)发送包时,会先查询RP缓存,如果已经有就不需要发送ARP包;
(3)为了让目标路由器修改IP或MAC地址后源网卡设备能及时识别出来,
ARP缓存中的值在一段时间后会被删除,时间一般为几分钟
】
IP模块处理IP和MAC让网卡可以使用的更广泛,因为MAC地址对应底层的网络,这样可以让网卡适应各种网络。
ARP缓存相关命令——arp
-a——显示所有的ARP缓存内容
-d——删除ARP缓存中保存的条目
相关概念
- 路由表——IP模块中用来判断将包发给谁的方法
关于路由器:
可以通过 route print 命令查看,
第一列(Netwrok Destination)——目标IP地址和第一列的某一行IP的部分重合即可(部分是因为这个只是目标网络的IP);
第二列(Netmask)——子网掩码;
第三列(Gateway)——表示下一个目标路由器的IP地址;
第四列(Interface)——表示网卡等网络接口设备的IP地址
路由表的第一行——目标地址和子网掩码都是0.0.0.0,这表示默认网关,如果其他的条目都无法匹配,则自动匹配该行!
如果Gateway 和 Interface 列的 IP 地址相同, 就表示不需要路由器进行转发, 可以直接将包发给接收方的 IP 地址。
- 网关(Gateway)
3、UDP模块
长度——8字节
UDP只管收发包,不做其他任何操作。
(1)特殊操作
a、数据存入缓冲区多少需要去发送的两个判断要素
(a)、每个网络包能容纳的数据长度
MTU是数据链路层的参数
- MTU(Maximum Transmission Unit,最大传输单元)——表示一个网络包的最大长度,以太网中一般是1500字节;(注意:MTU是包含头部的总长度!)
在使用 PPPoE 的 ADSL 等网络中, 需要额外增加一些头部数据, 因此 MTU 会小于 1500 字节。
- MSS(Maximum Segment Size,最大分段大小)——将头部去除后的MTU长度,TCP和IP的头部加起来一般是40字节,∴MTU = 40 + MSS (单位为字节)
(b)、时间
当应用程序发送数据的频率不高时,时间间隔可能较大,这种情况下就需要果断将数据发送出去。所以,协议栈内部有一个计时器,一定时间(以毫秒为单位)后就会将网络包发出。
(2)数据包的划分
a、TCP模块拆分数据
每块数据都有一个相对于数据开头的字节数,发送这一块儿数据时,SYN就会存储该字节数。
(3)网络包结构
- 报头——用来记录始终信号频率(为保证时钟信号的精准性,将时钟信号和数据信号混合,还原时也需要时钟信号来还原)总长位56bit。
- SFD(起始帧分界符)——8bit,最后两位为11,网卡将这里作为包的起始位置。
- FCS(帧校验序列)——用来检查包传输过程中因噪声导致的波形絮乱、数据错误。
长度为32bit。
接收方会对比自己收到的和自己计算出来的FCS是否相当,从而判断数据是否错误。
四、网卡部分
注意: 每个网址对应一个网卡
网卡初始化流程:
网卡将数据转化为以太网规格中的各种信号格式(此时数据转为电信号)!【通过网卡中的PHY或MAU模块】
PHY(物理层装置)——100Mbit/s以上的以太网转换模块
MAU(介质连接单元)——低速方式的以太网转换模块
收到网络包后通过中断的方式通知计算机。
如果收到的网络包的接收方地址和当前网卡的地址不同,IP模块会向发送方发送 ICMP消息。
五、网络相关硬件设备概述
1、路由器(router)【网络层 L3】——一种对包进行转发的设备,基于IP地址转发!
2、集线器(hub)【物理层 L1】
分类:
1)中继式集线器(信号会发送给子网内所有的设备)
2)交换式集线器(信号只会发送给指定的MAC地址对应的设备)
3、网卡(NIC,Network Interface Card)【物理层 L1】,也叫LAN卡,网络适配器。
4、网桥(bridge)【数据链路层 L2】——以太网中,数据链路层地址就是MAC地址。
5、交换机(switch)【数据链路层 L2】——可以看成多个网桥的集成设备,但是,也有三层(网络层)交换机
。
用集线器连接起来的几台计算机看作一个单位——子网
用路由器接入集线器——形成一个网络
网桥和集线器的区别:
网桥会过滤MAC地址(MAC地址表),这样网桥转发时不会将每个数据帧都 泛洪 至其他所有接口!
一个网桥指的是一个输入到一个输出的桥接。
6、网线
1)双绞线——为了抑制噪声
噪声(电磁波):
1)外源性噪声
2)内源性噪声【又叫串扰】
双绞线分类:
2)光纤
7、网口
绿灯——检测工作模式是否正常
工作模式:奇数位脉冲——确定同步【间隔固定】
偶数位脉冲——用于告诉对方自己的 工作模式 及 状态。
六、网络硬件设备详情
1、集线器
1)接口
MDI——(Media Dependent Interface,媒体相关接口)
对 RJ-45接口 和 信号收发模块 进行直连接线
MDI-X——(MDI-Cronssover,交叉的MDI)
对 RJ-45接口 和 信号收发模块 进行交叉接线
2、交换机
1)包转发
a、MAC地址 - 网线端口 的对应表
b、MAC地址表
注:交换机端口的MAC模块不具有MAC地址——即,交换机只引导包的走向,不会截留。
交换机的端口收到包后,直接将包存入缓冲区中。
特殊情况:
1)目的端口和源端口相同——丢弃这个包【所以,回环功能由网卡实现】
2)无法找到指定的MAC地址——将包发送到出源端口外的所有端口上
3)目标MAC地址是一个广播地址——同第2种情况
2)功能——只转发,不会作为 发送方 或 接收方
3)判断依据——MAC地址
3、路由器
操作依据——IP地址
功能模块:a、包转发模块——相当于IP模块
b、端口模块——相当于网卡【对接各种通信网络】
特殊情况:a、子网掩码为0.0.0.0——网络包接收方IP 和 路由表的目的地址 需要匹配的比特数为0
基于“优先匹配网络号比特数最长的”的规则!
b、匹配不到对应的路由时,会发送到默认网关(用于接入互联网的路由器的IP地址),该行路由信息被称之为默认路由。
1)转发功能——路由表(这里用的IP地址只包含网络号部分的值,主机号部分为0)
路由表的匹配规则:
a、首先匹配 网络号比特数 最长的 一条记录;
b、相同长度的有多个时,根据跃点计数值来判断,优先选择值最小的;
c、无法匹配——丢弃该包,并通过ICMP告知发送方
2)路由聚合——用于方便管理同一路由器下的多个子网
3)附加功能
a、地址转换
基本原理——在转发网络包时,对IP头部中的IP地址和端口号进行改写
实现方式:
ip地址——地址转换设备(一般默认为路由器)的互联网接入端口的地址
端口号——由地址转换设备随机选择一个空闲端口
对应关系——有一张专门的对应表
b、包过滤功能——根据预先设置的规则进行过滤
依据:MAC头部、IP头部、TCP头部
网络中可用于私有地址的范围仅限于一下这些:
10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
这些地址在公共网络地址中未分配,所以可以被用于私有地址。
七、接入网
此处未总结,接入网为用户到互联网(这里又叫骨干网)之间的网络,主要用于互联网供应商控制计算费用,管理用户。