20世纪60年代以来, 计算机网络得到了飞速发展。 各大厂商和标准组织为了在数据通信网络领域占据主导地位, 纷纷推出了各自的网络架构体系和标准, 如IBM公司的SNA协议, Novell公司的IPX/SPX协议, 以及广泛流行的OSI参考模型和TCP/IP参考模型。
在TCP/IP模型中,网际层IP提供的是一种不可靠的服务,它尽可能的把分组从源节点送到目的节点,但是并不提供任何可靠保证,而TCP在不可靠的IP层上提供了一个可靠的运输层,为了提供这种可靠的服务,TCP采用了超时重传,发送和接收的端到端的确认分组等机制。
数据封装
数据要在网络中传输,必须对它进行编码,以特定的格式进行封装,同时需要适当地封装足够的控制和地址信息,使它能够从发送方发送到接收方。
当应用程序用TCP/IP模型传数据时,数据被送入协议栈中,由上到下对每一层的数据进行加工(主要增加一些首部信息和尾部信息);TCP传给IP的数据单元被称为TCP报文段;IP传给网络接口层的数据单元被称为IP数据报;通过以太网传输的比特流称作帧。
MAC地址
网络中,每一台网络设备都用物理地址来标识自己,这个地址就是MAC地址。 网络设备的MAC地址是全球唯一的。MAC地址长度为48比特,通常用十六进制表示。MAC地址包含两部分:前 24 比 特 是 组 织 唯一标识符(OUI , Organizationally Unique Identifier),由IEEE统一分配给设备制造商。
通过MAC地址,数据帧的发送方式可以分为单播、组播、广播三种。
帧结构
数据包在以太网物理介质上传播之前必须封装头部和尾部信息, 封装后的数据包称为数据帧, 数据帧中封装的信息决定了数据如何传输。 以太网上传输的数据帧有两种格式, 选择哪种格式由TCP/IP协议簇中的网络层决定。
以太网上使用两种标准帧格式,Ethernet II帧格式,IEEE 802.3帧格式
Ethernet II帧格式:
各字段定义:
1、D.MAC(Destination MAC) 是目的MAC地址。 D.MAC字段长度为6个字节, 标识帧的接收者。
2、S.MAC(Source MAC) 是源MAC地址。 S.MAC字段长度为6个字节,标识帧的发送者。
3、类型字段(Type) 用于标识数据字段中包含的高层协议, 该字段长度为2个字节。 类型字段取值为0x0800的帧代表IP协议帧;类型字段取值为0x0806的帧代表ARP协议帧。
4、数据字段(Data) 是网络层数据, 最小长度必须为46字节以保证帧长至少为64字节, 数据字段的最大长度为1500字节。
5、循环冗余校验字段(FCS) 提供了一种错误检测机制。 该字段长度为4个字节。
IEEE 802.3帧格式:
各字段定义:
1、Length字段定义了Data字段包含的字节数。
2、逻辑链路控制LLC(Logical Link Control) 由目的服务访问点D.SAP(Destination Service Access Point ) 、 源服务访问点S.SAP(Source Service Access Point) 和Control字段组成。
3、SNAP(Sub-network Access Protocol) 由机构代码(Org Code)和类型(Type)字段组成。Org Code三个字节都为0。Type字段的含义与Ethernet_II帧中的Type字段相同。IEEE802.3帧根据D.SAP和S.SAP字段的取值又可分为以下几类:
(1)当D.SAP和S.SAP都取特定值0xff时,802.3帧就变成了NetwareETHERNET帧,用来承载NetWare类型的数据。
(2)当D.SAP和S.SAP都取特定值0xaa时,802.3帧就变成了ETHERNET_SNAP帧。ETHERNET_SNAP帧可以用于传输多种协议。
(3)D.SAP和S.SAP其他的取值均为纯IEEE802.3帧。
数据在各层传递格式的变化如下图所示:
IP编址
网络层位于数据链路层和传输层之间,提供IP路由功能,IP协议是网络层做重要的协议之一。数据链路层的以太帧剥离头部和尾部之后,需要根据帧头中Type字段确定下一步该帧发送到哪各上层协议进行处理,0x0800是IP协议。
IP报文头部
IP报文头部信息用于指导网络设备对报文进行路由和分片。 IP报文头部长度为20到60字节, 报文头中的信息可以用来指导网络设备如何将报文从源设备发送到目的设备。 其中,版本字段表示当前支持的IP协议版本,当前的版本号为4。DS字段早期用来表示业务类型,现在用于支持QoS中的差分服务模型, 实现网络流量优化。
IP分片:
网络中转发的IP报文的长度可以不同, 但如果报文长度超过了数据链路所支持的最大长度, 则报文就需要分割成若干个较小的片段才能够在链路上传输。 将报文分割成多个片段的过程叫做分片。
接收端根据分片报文中的标识符(Identification) , 标志(Flags), 及 片偏移(Fragment Offset) 字段对分片报文进行重组。 标识符用于识别属于同一个数据包的分片, 以区别于同一主机或其他主机发送的其它数据包分片, 保证分片被正确的重新组合。 标志字段用于判断是否已经收到最后一个分片。 最后一个分片的标志字段设置为0, 其他分片的标志字段设置为1, 目的端在收到标志字段为0的分片后, 开始重组报文。 片偏移字段表示每个分片在原始报文中的位置。 第一个分片的片偏移为0,第二个分片的片偏移表示紧跟第一个分片后的第一个比特的位置。 比如,如果首片报文包含1259比特, 那么第二分片报文的片偏移字段值就应该为1260。
生存时间TTL:
报文在网段间转发时, 如果网络设备上的路由规划不合理, 就可能会出现环路, 导致报文在网络中无限循环, 无法到达目的端。 环路发生后,所有发往这个目的地的报文都会被循环转发, 随着这种报文逐渐增多,网络将会发生拥塞。
为避免环路导致的网络拥塞, IP报文头中包含一个生存时间TTL(TimeTo Live) 字段。 报文每经过一台三层设备, TTL值减1。 初始TTL值由源端设备设置。 当报文中的TTL降为0时, 报文会被丢弃。 同时, 丢弃报文的设备会根据报文头中的源IP地址向源端发送ICMP错误消息。
协议号:
目的端的网络层在接收并处理报文以后, 需要决定下一步对报文该做如何处理。 IP报文头中的协议字段标识了将会继续处理报文的协议。 与以太帧头中的Type字段类似, 协议字段也是一个十六进制数。 该字段可以标识网络层协议, 如ICMP,也可以标识上层协议, 如TCP( 对 应 值 0x06 ) 、 UDP(对应值0x11) 。
IP地址
IP地址用来标识网络中的设备, 具有IP地址的设备可以在同一网段内或跨网段通信。IP地址包括两部分, 第一部分是网络号, 表示IP地址所属的网段, 第二部分是主机号, 用来唯一标识本网段上的某台网络设备。
每个网段上都有两个特殊地址不能分配给主机或网络设备。 第一个是该网段的网络地址, 该IP地址的主机位为全0, 表示一个网段。 第二个地址是该网段中的广播地址, 目的地址为广播地址的报文会被该网段中的所有网络设备接收。 广播地址的主机位为全1。
IPv4地址被划分为A、 B、 C、 D、 E五类。D类地址为组播地址。 主机收到以D类地址为目的地址的报文后, 且该主机是该组播组成员, 就会接收并处理该报文。
子网掩码
子网掩码用于区分网络部分和主机部分。每个IP地址和子网掩码一起可以用来唯一的标识一个网段中的某台网络设备。 子网掩码中的1表示网络位, 0表示主机位。
通过子网掩码可以判断主机所属的网段、 网段上的广播地址以及网段上支持的主机数。 eg:192.168.1.7/24,主机数位2^8=256,减去本网段的网络地址192.168.1.0/24和广播地址192.168.1.255,即该网段支持254个有效主机地址。
变长子网掩码(VLSM):借用主机位变成子网位,eg:224.184.192.245/27,借用了3位主机位。
无类域间路由(Classless Inter Domain Routing,CIDR)
消除了传统的A类、B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空间。它可以将好几个IP网络结合在一起,使用一种无类别的域际路由选择算法,使它们合并成一条路由从而较少路由表中的路由条目减轻Internet路由器的负担。
CIDR与VLSM的区别:
CIDR是把几个标准网络合成一个大的网络
VLSM是把一个标准网络分成几个小型网络(子网)
CIDR是子网掩码往左边移了,VLSM是子网掩码往右边移了
CIDR汇总与路由汇总的区别
路由汇总与CIDR汇总的区别:IP地址有“类”的概念,/8掩码是A类,/16掩码是B类,/24掩码是C类等等。但是/12,/18,/25呢?这就是无类的概念了。路由汇总有类的概念,同时汇总后的掩码长度必须要大于或等于主类网络的掩码长度;CIDR是无类域间路由,网络地址一致就能进行CIDR汇总。
示例:
1.)192.168.0.0/24 - 192.168.0.3/24
CIDR汇总:192.168.0.0/30
路由汇总:192.168.0.0/30
2.)192.168.0.0/24 - 192.168.3.0/24
CIDR汇总:192.168.0.0/22
路由汇总:不能汇总!(因为22<24,不能进行路由汇总)
CIDR的计算方法:
192.168.9.0/24 192.168.10.0/24 192.168.11.0/24
192.168.12.0/24 192.168.13.0/24 192.168.14.0/24
192.168.15.0/24
汇总以上路由条目
192.168.00001 001.0
192.168.00001 010.0
192.168.00001 011.0
192.168.00001 100.0
192.168.00001 101.0
192.168.00001 110.0
192.168.00001 111.0
192.168.00001 000.0/21 即 192.168.8.0/21
使用CIDR技术汇聚的网络地址的比特位必须是一致的.
网关
报文转发过程中, 首先需要确定转发路径以及通往目的网段的接口, 然后将报文封装在以太帧中通过指定的物理接口转发出去。如果目的主机与源主机不在同一网段, 报文需要先转发到网关, 然后通过网关将报文转发到目的网段。
网关是指接收并处理本地网段主机发送的报文并转发到目的网段的设备。为实现此功能, 网关必须知道目的网段的IP地址。 网关设备上连接本地网段的接口地址即为该网段的网关地址。
ICMP协议 -- Internet控制消息协议
ICMP是TCP/IP协议簇的核心协议之一, 它用于在IP网络设备之间发送控制报文, 传递差错、 控制、 查询等信息。
ICMP Redirect重定向消息用于支持路由功能。 转发到RTA是更优的路径, RTB向主机发送一个Redirect消息, 通知主机直接向另一个网关RTA发送该报文。
ICMP Echo消息常用于诊断源和目的地之间的网络连通性, 同时还可以提供其他信息, 如报文往返时间等。 ICMP定义了各种错误消息, 用于诊断网络连接性问题;根据这些错误消息, 源设备可以判断出数据传输失败的原因。
ICMP消息封装在IP报文中。 ICMP消息的格式取决于Type和Code字段,其中Type字段为消息类型, Code字段包含该消息类型的具体参数。
Ping
ICMP的一个典型应用是Ping。 Ping是检测网络连通性的常用工具, 同时也能够收集其他相关信息。
Ping命令的输出信息中包括目的地址、 ICMP报文长度、 序号、 TTL值以及往返时间。 序号是包含在Echo回复消息(Type=0) 中的可变参数字段, TTL和往返时间包含在消息的IP头中
Tracert
Tracert基于报文头中的TTL值来逐跳跟踪报文的转发路径。 Tracert是检测网络丢包及时延的有效手段, 同时可以帮助管理员发现网络中的路由环路。
ARP协议 -- 地址解析协议(Address Resolution Potocol)
ARP协议是TCP/IP协议簇中的重要组成部分, 它能够通过目的IP地址获取目标设备的MAC地址, 从而实现数据链路层的可达性。
一个网络设备要发送数据给另一个网络设备时, 必须要知道对方的IP地址。 但是, 因为IP数据报文必须封装成帧才能通过数据链路进行发送, 而数据帧必须要包含目的MAC地址, 因此发送端还必须获取到目的MAC地址。 通过ARP协议, 网络设备可以建立目标IP地址和MAC地址之间的映射。
免费ARP
主机被分配了IP地址或者IP地址发生变更后, 必须立刻检测其所分配的IP地址在网络上是否是唯一的, 以避免地址冲突。 主机A将ARP Request广播报文中的目的IP地址字段设置为自己的IP地址,如果收到 ARP Reply报文,则说明IP地址冲突了。
传输层协议
TCP协议--传输控制协议
TCP位于TCP/IP模型的传输层, 它是一种面向连接的端到端协议。 TCP作为传输控制协议, 可以为主机提供可靠的数据传输。
TCP建立连接--三次握手
- 主机A( 通常也称为客户端) 发送一个标识了SYN的数据段, 表示期望与服务器A建立连接, 此数据段的序列号( seq) 为a。
- 服务器A回复标识了SYN+ACK的数据段, 此数据段的序列号( seq)为b, 确认序列号为主机A的序列号加1( a+1), 以此作为对主机A的SYN报文的确认。
- 主机A发送一个标识了ACK的数据段, 此数据段的序列号( seq) 为a+1, 确认序列号为服务器A的序列号加1( b+1) , 以此作为对服务器A的SYN报文的确认。
TCP的可靠传输还体现在TCP使用了确认技术来确保目的设备收到了从源设备发来的数据, 并且是准确无误的。目的设备接收到源设备发送的数据段时, 会向源端发送确认报文, 源设备收到确认报文后, 继续发送数据段, 如此重复。
TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。
TCP关闭连接--四次握手
- 主机A想终止连接, 于是发送一个标识了FIN, ACK的数据段, 序列号为a, 确认序列号为b。
- 服务器A回应一个标识了ACK的数据段, 序列号为b, 确认序号为a+1, 作为对主机A的FIN报文的确认。
- 服务器A想终止连接, 于是向主机A发送一个标识了FIN, ACK的数据段, 序列号为b, 确认序列号为a+1。
- 主机A回应一个标识了ACK的数据段, 序列号为a+1, 确认序号为b+1, 作为对服务器A的FIN报文的确认。
UDP协议--用户数据报协议
UDP是一种面向无连接的传输层协议,传输可靠性没有保证。
当应用程序对传输的可靠性要求不高, 但是对传输速度和延迟要求较高时, 可以用UDP协议来替代TCP协议在传输层控制数据的转发。 UDP将数据从源端发送到目的端时, 无需事先建立连接。 UDP采用了简单、 易操作的机制在应用程序间传输数据, 没有使用TCP中的确认技术或滑动窗口机制, 因此UDP不能保证数据传输的可靠性, 也无法避免接收到重复数据的情况。
主机A发送数据包时, 这些数据包是以有序的方式发送到网络中的, 每个数据包独立地在网络中被发送, 所以不同的数据包可能会通过不同的网络路径到达主机B。 这样的情况下, 先发送的数据包不一定先到达主机B。 因为UDP数据包没有序号, 主机B将无法通过UDP协议将数据包按照原来的顺序重新组合, 所以此时需要应用程序提供报文的到达确认、排序和流量控制等功能。 通常情况下, UDP采用实时传输机制和时间戳来传输语音和视频数据。
UDP不提供重传机制,占用资源小,处理效率高。
UDP适合传输对时延敏感的流量, 如语音和视频。
数据转发
1、数据帧转发
主机A工作在半双工状态下, 所以会使用CSMA/CD来检测链路是否空闲。如果链路空闲, 主机A会将一个前导码(Preamble) 和一个帧首定界符(SFD) 附加到帧头然后进行传输。 前导码的作用是使接收设备进行同步并做好接收数据帧的准备。 前导码是包括了7个字节的二进制“1”、“0”交替的代码, 即1010…10共56位。 帧首定界符是长度为1个字节的10101011二进制序列, 它的作用是使接收端对帧的第一位进行定位。
主机A发送数据帧到共享以太网,此网络中的所有网络设备都会收到该帧。设备收到帧之后,首先会进行FCS校验。如果FCS校验未能通过,则帧被立即丢弃。对于通过了FCS校验的帧,设备会检查帧中的目的MAC地址。如果帧中的目的MAC地址与自己的MAC地址不同,设备将丢弃帧,如果相同,则会继续处理。处理过程中,帧头帧尾会被剥去(也就是解封装),剩下的数据报文会被根据帧头中的类型字段的值来送到网络层中的对应协议模块去处理。
2、数据包转发
RTA收到此数据报文后,网络层会对该报文进行处理。 RTA首先根据IP头部信息中的校验和字段,检查IP数据报文头部的完整性,然后根据目的IP地址查看路由表,确定是否能够将数据包转发到目的端。 RTA还必须对TTL的值进行处理。另外,报文大小不能超过MTU值。如果报文大小超过MTU值,则报文将被分片。
网络层处理完成后,报文将被送到数据链路层重新进行封装,成为一个新的数据帧,该帧的头部会封装新的源MAC地址和目的MAC地址。如果当前网络设备不知道下一跳的MAC地址,将会使用ARP来获得。
3、数据帧解封装
服务器A处于一个共享以太网中,两台服务器都会收到RTB发送的数据帧。该帧的目的MAC地址与服务器B的接口MAC地址不匹配,所以会被服务器B丢弃。
服务器A成功收到该帧,并通过FCS校验。服务器A将利用帧中的类型字段来识别在网络层处理该数据的协议。该示例中,服务器A会将解封装后的此数据交给网络层的IP协议来进行处理。
4、数据包解封装
服务器A通过IP协议来处理该报文,首先会通过校验和字段来验证报文头的完整性,然后检查IP报文头中的目的IP地址是否与自己当前的IP地址匹配。
如果在源与目的之间的数据传输期间数据发生了报文分片,则报文会被目的端重新组合。标识字段用于标识属于同一数据源的分片报文,偏移量表示该分片在原分组中的相对位置。 标志字段目前只有两位有意义,标志字段最低位为1,表示后面还有分片,为0表示这已经是最后一个数据片;中间一位为1表示不能分片,为0表示允许分片。 所有的分片报文必须被目的端全部接收到后才会进行重新组合。协议字段表示此数据包携带的上层数据是哪种协议的数据。 需要注意的是, 下一个报头并非总是传输层报头。 例如, ICMP报文也是使用IP协议封装, 协议字段值为0x01。
5、数据段解封装
当IP报文头被处理完并剥离后,数据段会被发送到传输层进行处理。在此示例中,传输层协议使用的是TCP,且发送端和接收端已经通过三次握手建立了连接。传输层收到该数据段后, TCP协议会查看并处理该数据段头部信息,其中目的端口号为80,用于表示处理该数据的应用层协议为HTTP协议。 TCP处理完头部信息后会将此数据段头部进行剥离,然后将剩下的应用数据发送到HTTP协议进行处理。