基础 - 数据通信基础及报头
为什么现实中不用OSI,而是TCP/IP?
现实中使用的通信模型是TCP/IP四层而不是OSI七层,后者便于理解和学习
- OSI模型功能和服务定义复杂,很难产品化;
- 很多功能在多个层次重复,功能冗余
- 各层任务分配不均匀;
OSI七层模型
- 应用层:提供数据的接口,文件、打印、消息、数据库和应用服务。
- 表示层:表示数据,处理数据、数据加密、压缩、转换。
- 会话层:维持不同程序之间的数据分离;建立、维持和终止会话。
- 传输层:端到端的连接,可靠和不可靠的传输,错误纠正。
- 网络层:提供逻辑寻址,以使路由选择。
- 数据链路层:将数据包组合为字节,字节组为帧,使用MAC地址提供介质的访问,执行差错检测,但不纠正。
- 物理层:在设备之间传输的比特流。
两个PC间的远程控制:
- 传输层:TCP UDP 如果是TELNET那么传输层为TCP协议,
- 源端口为大于1023的任意,小于49151,目的端口号:23
- 网络层:已知源目IP地址
数据链路层:
- 知道源MAC,未知目的MAC,发送数据包前要先查看ARP表,如果有的话直接根据ARP表项转发,如果没有就去发送ARP。
- 二层也有自己的优先级标识,802.1p,封装在802.1Q里。
- 物理层:电口网线-比特流,无线-无线电波,光纤-光;
- 物理层协议:CSMA/CD,CSMA/CA;
应用层
最上层的,也是能直接接触到的就是应用层(Application Layer),我们电脑或手机使用的应用软件都是在应用层实现。那么,当两个不同设备的应用需要通信的时候,应用就把应用数据传给下一层,也就是传输层。
所以,应用层只需要专注于为用户提供应用功能,比如 HTTP、FTP、Telnet、DNS、SMTP等。
应用层是不用去关心数据是如何传输的,应用层工作在操作系统中的用户态,传输层及以下则工作在内核态。
传输层
应用层的数据包会传给传输层,传输层(Transport Layer)是为应用层提供网络支持的。
在传输层会有两个传输协议,分别是 TCP 和 UDP。
TCP
TCP 的全称叫传输控制协议(Transmission Control Protocol),大部分应用使用的正是 TCP 传输层协议,比如 HTTP 应用层协议。TCP 相比 UDP 多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠地传输给对方。
应用需要传输的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包。在 TCP 协议中,把每个分块称为一个 TCP 段(TCP Segment)。
当设备作为接收方时,传输层则要负责把数据包传给应用,但是一台设备上可能会有很多应用在接收或者传输数据,因此需要用一个编号将应用区分开来,这个编号就是端口。
比如 80 端口通常是 Web 服务器用的,22 端口通常是远程登录服务器用的。而对于浏览器(客户端)中的每个标签栏都是一个独立的进程,操作系统会为这些进程分配临时的端口号。
由于传输层的报文中会携带端口号,因此接收方可以识别出该报文是发送给哪个应用。
TCP报文详解如下:
源端口号:16bit 一般是大于1023,自己定义的;64911后为扩展端口号
目的端口号:16bit 一般是小于1024,具体要去访问某个服务,就要对应相应的端口号,端口对应服务;
序号:32bit,占4个字节,是本报文段所发送的数据项目组第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。例如,一报文段的序号为300,而数据大小100字节,则下一个报文段的序号就是400;
确认序号:32bit,占4字节,是期望收到对方下次发送的数据的第一个字节的序号,也就是期望收到的下一个报文段的首部中的序号;
因为序号字段有32比特长,可以对4GB的数据进行编号,如许就可包管当序号反复应用时,旧序号的数据早已在收集中消散了;数据偏移:占4比特,默示数据开端的处所离TCP报文段的肇端处有多远。这实际上就是TCP报文段首部的长度。因为首部长度不固定,是以数据偏移字段是须要的。
保存字段: 6比特,供往后应用,今朝置为0。
6个比特的把握字段
- 紧急比特URGent:当URG=1时,注解此报文应尽快传送,而不要按本来的列队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长;
- 确认比特ACK:只有当ACK=1时,确认序号字段才有意义;
急迫比特PSH:当PSH=1时,注解恳求远地TCP将本报文段立即传送给其应用层,而不要等全部缓存都填满了之后再向上交付。 - 复位比特ReSeT:当RST=1时,注解呈现严重错误,必须断开连接,然后再重建传输连接。复位比特还用来拒绝一个不合法的报文段或拒绝打开一个连接;
- 同步比特SYN:在建立连接时应用,当SYN=1而ACK=0时,注解这是一个连接恳求报文段。对方若同意建立连接,在返回的报文段中使SYN=1和ACK=1。SYN=1默示这是一个连接恳求或确认报文,而ACK的值用来区分这是哪一种报文;
- 终止比特FINal:用来断开一个连接,当FIN=1时,发送方字节串结束,请求断开传输连接;
窗口字段
窗口Window:占2字节,默示报文段发送方的接管窗口,单位为字节。此窗口告诉对方,“在未收到我的确认时,你可以发送的数据的字节数至多是此窗口的大小。”
TCP 的 三次握手四次挥手看这篇文章
UDP
UDP 相对来说就很简单,简单到只负责发送数据包,不保证数据包是否能抵达对方,但它实时性相对更好,传输效率也高。当然,UDP 也可以实现可靠传输,把 TCP 的特性在应用层上实现就可以,不过要实现一个商用的可靠 UDP 传输协议,也不是一件简单的事情。
网络层
传输层可能大家刚接触的时候,会认为它负责将数据从一个设备传输到另一个设备,事实上它并不负责。
实际场景中的网络环节是错综复杂的,中间有各种各样的线路和分叉路口,如果一个设备的数据要传输给另一个设备,就需要在各种各样的路径和节点进行选择,而传输层的设计理念是简单、高效、专注,如果传输层还负责这一块功能就有点违背设计原则了。
也就是说,我们不希望传输层协议处理太多的事情,只需要服务好应用即可,让其作为应用间数据传输的媒介,帮助实现应用到应用的通信,而实际的传输功能就交给下一层,也就是网络层(Internet Layer)。
网络层最常使用的是 IP 协议(Internet Protocol),IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文。
IP头部详解:
版本号(Version):长度4比特。标识目前采用的IP协议的版本号。一般的值为0100(IPv4),IPv6的值(0110)。
IP包头长度(Header Length):长度4比特。这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为4个字节,即本区域值= IP头部长度(单位为bit)/(84),因此,一个IP包头的长度最长为“1111”,即154=60个字节。IP包头最小长度为20字节。对于标准ipv4报头,这个字段的值肯定是0101
服务类型(Type of Service):长度8比特。这个字段可以拆分成两个部分:Precedence和TOS。TOS目前不太使用。而Precedence则用于QOS("Quality of Service",中文名为"服务质量")应用。(TOS字段的详细描述RFC 1340 按位被如下定义 PPP D T R C 0
PPP:定义包的优先级
-000 普通 (Routine)
001 优先的 (Priority)
010 立即的发送 (Immediate)
011 闪电式的 (Flash)
100 比闪电还闪电式的 (Flash Override) 视频
101 CRI/TIC/ECP 语音
110 网间控制 (Internetwork Control)
111 网络控制 (Network Control)
D 时延: 0:普通 1:尽量小
T 吞吐量: 0:普通 1:尽量大
R 可靠性: 0:普通 1:尽量大
M 传输成本: 0:普通 1:尽量小
0 最后一位被保留,恒定为0确定数据包的优先级,优先的会优先传递;
正常情况下只会使用前3个bit,那么优先级的范围是0-7;一般情况下普通数据优先级为0,视频数据优先级为4,语音数据优先级为5,协议报文优先级为6;
之后服务类型升级,使得可以更精确去匹配数据包的转发效率,升级后的字段名是DSCP,启用了前面的6个bit;
为了兼容之前的优先级,DSCP里有想要的名称
CS就是DSCP对优先级的兼容;
EF位:DSCP值为46时,就是DSCP的最优的数据包,会把最优的先去转发;
AF:将DSCP的6个BIT分成3段---000 00 0 前3位为一段设值为X,中间2位为一段设值为Y,最后一位恒等于0,最终表示为XY0,另外规定:X取值(1-4),Y取值(1-3),并且X越大表示越优先被传递,Y越大表示越优先被丢弃;AF:11 12 13 21 22 23 31 32 33 41 42 43
IP包总长(Total Length):长度16比特。以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。
标识符(Identifier):长度16比特。该字段和Flag和Fragment Offest字段联合使用,对大的上层数据包进行分段(fragment)操作。用来唯一标识一个数据包的
标记(Flag):长度为3比特,第一位不使用
- 长度第2位是不分段(DF),当DF位被置为1时,路由器将不能对数据包进行分段处理。如果数据包因为不能被分段而不能转发,那么路由器将丢弃数据包并向数据发送方发送错误信息。
- 第3位表示更多分段(MF),当路由器对数据包分段时除了最后一个分段的MF位置0 ,其它分段的MF位全设置为1,当接收者收到MF为0的分段停止分段。
- Bit 0: reserved, must be zero
- Bit 1: (DF) 0 = May Fragment, 1 = Don't Fragment.
- Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.
分段序号(Fragment Offset):长度13比特。该字段对包含分段的上层数据包的IP包赋予序号。由于IP包在网络上传送的时候不一定能按顺序到达,这个字段保证了目标路由器在接受到IP包之后能够还原分段的上层数据包。到某个包含分段的上层数据包的IP包在传送是丢失,则整个一系列包含分段的上层数据包的IP包都会被要求重传。
生存时间(Time to Live):长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。IP包每经过一次三层,TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于故障而导致IP包在网络中不停被转发。
协议号:8位。以下是比较常用的协议号:
1 ICMP
2 IGMP
6 TCP
17 UDP
88 EIGRP
89 OSPF头部校验(Header Checksum):长度16比特,由于IP包头是变长的,所以提供一个头部校验来保证IP包头中信息的正确性。
源IP地址(Source IP Addresses):长度32比特。标识了这个IP包的源IP地址。
目的IP地址(Destination IP Address):长度32比特。标识了这个IP包的目的IP地址。
可选项(Options):这是一个可变长的字段,长度为0或32bit的整倍数,最大320bit,如果不足则填充到满。该字段由起源设备根据需要改写。可选项目包含以下内容:
- 松散源路由(Loose source routing):给出一连串路由器接口的IP 地址。IP 包必须沿着这些IP 地址传送,但是允许在相继的两个IP地址之间跳过多个路由器。
- 严格源路由(Strict source routing):给出一连串路由器接口的IP 地 址。IP包必须沿着这些IP地址传送,如果下一跳不在IP 地址表中则表示发生错误。
- 路由记录(Record route):当IP包离开每个路由器的时记录路由器的出站接口的IP 地址。区别于traceroute的是,record可以记录来 回的路径,而traceroute只可以记录单方向的;
- 时间戳(Timestamps):当IP包离开每个路由器的时候记录时间。
填充(Padding):因为IP包头长度(Header Length)部分的单位为32bit(4个字节),所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。
网络接口层
生成了 IP 头部之后,接下来要交给网络接口层(Link Layer)在 IP 头部的前面加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上。
网络接口层主要为网络层提供「链路级别」传输的服务,负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标识网络上的设备。
MAC头部详解:
- 协议:S-HDLC/PPP;E/F/G-802.3,以太网II;
- 前导符:8字节,接口根据前导符来确定对端的介质信号是否有携带数据(即是数据电流还是探测电流);
- 目的MAC:6字节;
- 源MAC:6字节;
- 长度类型字段:2字节;
- 如果长度类型字段的值大于1500,表示为类型,这个二层协议就叫做以太网II,该字段表示网络层使用什么协议:(0X0800=ip 0x0806=arp),然后置于数据流的长度就将其定义为固定长度1500,是现在最常见的二层协议;
- 如果长度类型字段的值小于1500,表示为长度,这个二层协议就叫做802.3,就能表示出这个数据流具体的长度,但是这就无法得知上层的协议,无法继续向后去读取,这时通过新加中间报头LLC,然后在LLC层报头指明上层协议;
- FCS校验,防止高低电平的错位;
802.1Q报头:
- 802.1QTag的长度是4bytes,它位于以太网帧中源MAC地址和长度/类型之间。802.1QTag包含4个字
- Type:长度为2bytes,表示帧类型,802.1Qtag帧中type字段取固定值0x8100,如果不支持802.1Q的设备收到802.1Q帧,则将其丢弃。
- PRI:priority字段,长度为3bit,表示以太网帧的优先级,取值范围是0~7,数值越大,优先级越高。当交换机/路由器发生传输用色时,优先发送优先级高的数据帧。
- CFI:Canonical FormatIndicator,长度为1bit,表示MAC地址是否是经典格式。CFI为0说明是经典格式,CFI为1表示为非经典格式。该字段用于区分以太网帧、FDDI帧和令牌环网帧,在以太网帧中,CFI取值为0。
- VID:VLAN ID,长度为12bit,取值范围是0~4095,其中0和4095是保留值,不能给用户使用。