1 网络分层
2 物理层
- 物理层定义了接口标准、线缆标准、传输速率、传输方式等
2.1 数字信号与模拟信号
- 模拟信号(Analog Signal)
- 连续,适合长距离传输
- 抗干扰能力差,受到干扰时波形变形很难纠正
- 数字信号(Digital Signal)
- 离散(不连续)的信号,值只能为1或0,没有中间值,不适合长距离传输
- 抗干扰能力强,受到干扰时波形失真可以修复
2.2 数据通信模型
-
局域网:网线不能超过100m,因此两台机器如果过长,需要通过多个集线器或交换机相连
-
广域网
2.3 信道
- 信道:信息传输的通道,一条传输介质上(比如网线)上可以有多条信道
3 数据链路层
- 链路:从1个节点到相邻节点的一段物理线路(有线或无线),中间没有其他交换节点,例如交换机,集线器不算交换节点
- 在一条链路上传输数据时,需要有对应的通信协议来控制数据的传输
- 不同类型的数据链路,所用的通信协议可能不同,而不同的通信协议传输时帧的格式也不同
- 广播信道:用同轴电缆、集线器等组成的网络,使用CSMA/CD协议
- 点对点信道:两个路由器之间的信道,使用PPP协议
3.1 数据链路层的3个基本问题
3.1.1 封装成帧
- 帧的数据部分:就是网络层传递下来的数据包
- MTU:最大传输单元
- 每一种数据链路层协议都规定了所能够传送的帧的数据长度上限
- 以太网的MTU为1500个字节
- 帧开始符:SOH(Start Of Header)
- 帧结束符:EOT(End Of Transmission)
3.1.2 透明传输
-
数据部分一旦出现了SOH、EOT,就需要自动进行转译,防止接收端将帧拆开时,误将数据中的SOH、EOT当作整个帧的开始符和结束符,这个动作对发送数据包的客户透明
3.1.3 差错检验
- 帧尾部中,在帧结束符之前,有个几个字节,是根据帧的数据部分+首部计算得到的,成为FCS,当数据包传递到对方后,对方再根据帧的数据部分+首部重新计算,判断是否和帧中的FCS相等,如果相等就接收,否则丢弃
- 当有bit流来到网卡,网卡首先会进行差错校验,如果校验通过则接收,并将进行差错检验的FCS给扔掉,否则丢弃,因此说网卡拥有数据链路层和物理层的功能,是一个二层设备
- Wireshark抓到的帧没有FCS ,因为它抓到的是差错校验通过的帧(帧尾的FCS会被硬件去掉),Wireshark抓不到差错校验失败的帧
- 当路由器接收到数据,先把之前的首部和尾部删除,自己按自己的协议重新加上首部和尾部,因此每段传输使用的bit流实际上是不同的
3.2 CSMA/CD协议
-
CSMA/CD:(Carrier Sense Multiple Access with Collision Detectio),载波侦听多路访问/冲突检测
- 载波监听:因为是CSMA用在集线器上,是半双工通信,因此CSMA协议,会监听自己想使用的信道,是否有人在使用,如果有人在用就等待一阵后再发送
- 多路访问:连接集线器上所有电脑,都能发信息给集线器
- 冲突检测:如果两个人同时发送内容给集线器,信号会冲突,各自回弹,网卡需要能检测出,这个信号是别人返回的,还是由于冲突弹回来的
-
使用了CSMA/CD的网络可以称为是以太网(Ethernet),它传输的是以太网帧
-
以太网帧的格式有:Ethernet V2标准、IEEE的802.3标准,最多使用的是Ethernet V2标准
-
为了检测正在发送的帧是否产生了冲突,以太网的帧至少要64字节
-
用交换机组建的网络,已经支持全双工通信,不需要再使用CSMA/CD,但它传输的帧依然是以太网帧,也因此用交换机组建的网络,依然可以叫做以太网
-
Ethernet V2标准
- 首部:目标MAC +源MAC + 网络类型(ipv4/ipv6)
- 没有帧开始符和帧结束符,因为以太网帧使用曼切斯特编码,发现没有信号跳变就是帧结束,所以不用开始结束符,但在物理层会插入一个开始符
- 由于以太网帧最少64字节,而目标MAC+源MAC+类型+FCS共18字节,因此就要求帧的数据部分长度至少是64-18=46字节,当数据部分的长度小于46字节时,数据链路层会在数据的后面加入一些字节填充,接收端会将添加的字节去掉,帧的数据部分最多不能超过MTU规定的1500字节
3.3 PPP协议
-
Point to Point Protocol
-
就是第一个路由器传送给第二个,所以根本不需要源MAC和目标MAC,因为只有一条路。对于CSMA/CD协议,是广播,谁都能收到,所以自然需要目标MAC,来确认数据包到底是否发送给自己
-
PPP帧
- Address字段:图中的值是0xFF,形同虚设,点到点信道不需要源MAC、目标MAC地址
- Control字段:图中的值是0x03,目前没有什么作用
- Protocol字段:内部用到的协议类型
- 帧开始符、帧结束符:0x7E
-
字节填充
3.3 常见设备层级
- 网卡:拥有数据链路层和物理层的功能,因此是二层设备
- 集线器:就相当于一个网线,直接传输,所以是一层设备
- 路由器:需要记录、转换IP,因此是三层设备
4 网络层
-
网络层数据包(IP数据包,Packet)由首部、数据2部分组成。数据大多时候是由传输层传递下来的数据段(Segment)
-
对于3层的协议,例如arp、ip、icmp,当发送一个icmp数据包时,网络层的数据不是从运输层来的,是icmp直接组建好了一个数据包,作为网络层的数据,然后网络层在其前面再加上首部就得到最终数据包。我们平时在Cisco Packet Tracer中,点击icmp数据包,也能发现,其在运输层没有数据
-
相关字段含义
-
版本
- 0100:IPV4
- 0110:IPv6
-
首部长度:二进制乘以4才是最终长度,最小值为0101,也就是20,最大值为1111,也就是60
-
区分服务:可以在路由器上设置,发现区分服务为指定值的数据包,优先让其通过,从而提高网络的服务质量,区分服务可以在操作系统中直接配置
-
总长度:整个数据段的长度,最大值为65535
- 但数据链路层帧的数据部分最大1500字节,因此以过大的IP数据包,需要分成片(fragments)传输给数据链路层
- 每一片都有自己的网络层首部(IP首部)
-
标识
- 数据包的ID,当数据包过大进行分片时,同一个数据包的所有片的标识都是一样的
- 有一个计数器专门管理数据包的ID,每发出一个数据包,ID就加1
- 方便服务器判断收到的哪些帧属于同一个IP数据包,不然不同数据包的帧穿插到达,无法将他们重新组装成原始的IP数据包
-
标志
- 第1位(Reserved Bit):保留
- 第2位(Don’t Fragment):1代表不允许分片,0代表允许分片
- 第3位(More Fragments):1代表不是最后一片,0代表是最后一片,如果没有这一位,那么服务端就不知道自己是否已经收到了数据包的所有帧
-
片偏移
-
片偏移*8,为字节偏移,因此每片的字节数,必须是8的整数倍
-
ping ke.qq.com -l 4000:发送4000字节的数据包给ke.qq.com,在Wireshark中,过滤器输入ip.addr==14.22.3.189,发现每片信息如下,片偏移是1480,这是因为帧的数据部分最多是1500字节,祛除每片需要包含的IP首部20字节,因此每片实际包含数据1480字节片 总长度 标识 DF MF 片偏移 (乘8以后) 片1 1500 28102 0 1 0 片2 1500 28102 0 1 1480 片3 1068 28102 0 0 2960
-
-
生存时间
- 每个路由器在转发之前会将TTL减1,一旦发现TTL减为0,路由器会返回错误报告
- 观察使用ping命令后的TTL,能够推测出对方的操作系统、中间经过了多少个路由器
- 如果不设置ttl,可能由于路由表设置有问题,导致数据在两个路由器间来回发送,形成死循环
- windows下
ping baidu.com -i 1,表示设置TTL为1,此时会发现网关回复你过期,因为网关发现TTL从1减为0,所以不允许该数据包通过路由器,不断调整-i 后的值,最后看到什么时候通了,那你就能推断出自己到百度需要经过多少个路由 -
ping baidu.com命令会在控制台打印从百度返回的数据包的最终的TTL值,例如为49,而百度通常使用linux作为服务器,默认TTL为64,因此也可以计算出百度到自己电脑,需要经过64-49=15台路由器 - 也可以用更简单的命令
tracert baidu.com,或pathping baidu.com来跟踪数据包经过了哪些路由器
-
协议
-
表明所封装的数据是使用了什么协议
协议 ICMP IGMP IP TCP EGP IGP UDP IPV6 ESP OSPF 值(十进制) 1 2 4 6 8 9 17 41 50 89
-
-
首部检验和
- 检查首部是否有误
-
5 传输层
-
传输层有2个协议
- TCP(Transmission Control Protocol),传输控制协议
- UDP(User Datagram Protocol),用户数据报协议
TCP UDP 连接性 面向连接 无连接 可靠性 可靠传输,不丢包 不可靠传输,尽最大努力交付,可能丢包 首部占用空间 大 小 传输速率 慢 快 资源消耗 大 小 应用场景 浏览器、文件传输、邮件发送 音视频通话、直播 应用层协议 HTTP、HTTPS、FTP、SMTP、DNS DNS -
套接字(Socket):就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制
-
我理解所谓面向连接,就是A和B通信时,A和B上各建立一个套接字,发送和接收数据只靠这两个套接字,这两个套接字无法从其他计算机接收或发送数据,而无连接,指每次通信时,都新建一个套接字,A发送给B数据使用的套接字和接收B中数据的套接字不是同一个
-
如果视频使用tcp,会导致前几秒说的话,突然再后面插入进来,整个聊天顺序混乱,因为可能前面的说的话不小心丢包了,tcp为了确保可靠传输,过后又发了一次,之前发送的数据没法成功就算了的情况,适合用udp
-
一般应用层是http,传输层就用tcp,因为我们知道,http一般都用于访问浏览器页面,而访问浏览器时,是不希望有数据丢失的
5.1 UDP
- 长度:首部+数据
- 检验和:伪首部+首部+数据,伪首部仅在计算检验和时起作用,并不会传递给网络层
- 端口
- 客户端的源端口是临时开启的随机端口
- 防火墙可以设置开启\关闭某些端口来提高安全性
- 可以使用netstat命令查看被占用的端口,以及其对应的应用程序
- telnet 主机 端口:查看是否可以访问主机的某个端口
5.2 TCP
5.2.1 数据格式
- 数据偏移
- 数据偏移*4=首部长度,范围为5~15,因此TCP首部长度为20~60
- 叫数据偏移是因为,首部有多长,就意味着,TCP数据部分作为IP数据部分时,需要向右偏移多少
- TCP中并不像UDP中会有字段记录整个报文长度,但其实整个报文长度可以通过IP首部中的信息推断出来,传输层的数据长度 = 网络层的总长度 – 网络层的首部长度 – 传输层的首部长度
- 所以说UDP中长度字段没必要占16位,其实只需要足够记录首部长度即可,占16位纯粹是为了保证首部是32bit对齐
- 保留
- 占6位,目前全为0
- 有些资料中认为TCP首部的保留字段占3位,标志字段占9位,也正确,因为保留中的后3个基本不用,Wireshark也是如此
- 检验和
- 伪首部 + 首部 + 数据
- 伪首部:占用12字节,仅在计算检验和时起作用,并不会传递给网络层
- 标志位
- URG(Urgent):当URG=1时,紧急指针字段才有效。表明当前报文段中有紧急数据,应优先尽快传送
- ACK(Acknowledgment):当ACK=1时,确认号字段才有效
- PSH(Push)
- RST(Reset):当RST=1时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接
- SYN(Synchronization)
- 当SYN=1、ACK=0时,表明这是一个建立连接的请求
- 若对方同意建立连接,则回复SYN=1、ACK=1
- 通过Wireshark观察数据包,使用http协议发送请求之前,会有3个tcp协议的请求,其实就是3次握手
- FIN(Finish):当FIN=1时,表明数据已经发送完毕,要求释放连接
- 通过Wireshark先查看着色规则,View–Coloring Rules,发现如果FIN为1时,为红色,这样就能方便地找到对应的被丢弃的数据包
- 紧急指针:表示tcp数据部分前多少长度的字节比较紧急
- 序号
- 在传输过程的每一个字节都会有一个编号
- 在建立连接后,序号代表这一次传给对方的TCP数据部分的第一个字节的编号
- 注意建立连接前,序号有其他含义,且序号不是从1开始的
- 当建立连接时,系统会为该连接生成一个唯一的序列,用于表示数据包属于同一个连接
- Wireshark中对于序号,有Sequence number和Sequence number(raw),后者才是真正的序号,是一个很大的值,前者是根据原生序号-建立连接时生成的序列,而计算出的值,这个值才从1开始
- 在建立连接后,确认号代表:期望对方下一次传过来的TCP数据部分的第一个字节的编号
- 注意建立连接前,确认号有其他含义
- 如果想传输一份文件,那么会先在传输层分成几个段,然后在网络层分成几个包,最后在数据链路层分成几个帧,最终进行传输,一般情况传输层就已经将数据都拆分好,基本不用其他层拆
- 窗口:可以完成流量控制功能,告知对方下一次允许发送的数据大小(字节为单位)
- 使用Wireshark抓包时,尽量抓http请求的数据包,因为https太复杂,<www.icp.chinaz.com>就是http请求,访问前可以通过ip.addr==113.96.140.220来过滤访问该网页的数据包,从而方便观察
5.2.2 可靠传输
5.2.2.1 停止等待ARQ协议
- ARQ(Automatic Repeat-reQuest):自动重传请求
- 很久以前,使用停止等待ARQ协议保证数据可靠,也就是A发送给B,如果B没有返回给A确认收到,A不会继续传输下一份数据,会等待一阵后,重新将这份数据发送给B
- 每次发送必须等上一次发完才能继续,效率很低
5.2.2.2 连续ARQ协议+滑动窗口协议
- 现在使用连续ARQ协议+滑动窗口协议
5.2.3 流量控制
- 服务器会动态调整窗口的大小,客户端一次可以传送给服务器多个TCP数据包,但TCP数据部分的总和不能超过窗口大小
5.2.4 选择性确认
-
在TCP通信过程中,如果发送序列中间某个数据包丢失(比如1、2、3、4、5中的3丢失了)
-
TCP会通过重传最后确认的分组后续的分组(最后确认的是2,会重传3、4、5)
-
这样原先已经正确传输的分组也可能重复发送(比如4、5),降低了TCP性能
-
为改善上述情况,发展出了SACK(Selective Acknowledgment,选择性确认)技术
- 告诉发送方哪些数据已经提前收到
- 使TCP只重新发送丢失的包(比如3),不用发送后续所有的分组(比如4、5)
-
SACK信息会放在TCP首部的选项部分
- Kind:占1字节。值为5代表这是SACK选项
- Length:占1字节。表明SACK选项一共占用多少字节
- Left Edge:占4字节,左边界
- Right Edge:占4字节,右边界
- 最多能放4组边界信息