计算机网络要点基础(网络层、传输层)

计算机网络基础要点

OSI模型与各层协议概览

ISO-OSI模型功能TCP/IP模型协议
物理层比特流传输接口层局域网标准协议(IEEE 802系列,包括以太网、无线局域网协议)、PPP
数据链路层将比特流转化为逻辑链路、帧传递、错检
网络层IP寻址、路由选择、点到点的数据包传递网络层ARP、IP、ICMP、路由协议
传输层端到端的报文传递传输层TCP、UDP
会话层建立管理会话的连接应用层HTTP、FTP、DHCP、DNS
表示层数据的格式化、加密解密
应用层为各种应用程序提供网络服务


网络层

IP 协议

要求:

  • 熟悉 IPv4地址分类及范围
  • 熟悉 子网的划分
  • 了解 IPv4与IPv6区别

  IP协议提供的是无连接的、不可靠的数据分组传输服务(降低了对网络线路的需要)

IP数据报格式

详见下文附录-报文分析-网络层部分

协议字段与对应值:

  • TCP:6
  • UDP: 17

IPv4 地址分类
分类前缀码开始地址结束地址CIDR修饰默认子网掩码
A类地址00.0.0.0127.255.255.255/8255.0.0.0
B类地址10128.0.0.0191.255.255.255/16255.255.0.0
C类地址110192.0.0.0223.255.255.255/24255.255.255.0
D类地址 (组播)1110224.0.0.0239.255.255.255/4未定义
E类地址 (保留)1111240.0.0.0255.255.255.255/4未定义
A类地址
  1.  0.  0.  1 = 00000001.00000000.00000000.00000001
126.255.255.254 = 01111110.11111111.11111111.11111110
                  0nnnnnnn.HHHHHHHH.HHHHHHHH.HHHHHHHH
B类地址
128.  1.  0.  1 = 10000000.00000001.00000000.00000001
191.255.255.254 = 10111111.11111111.11111111.11111110
                  10nnnnnn.nnnnnnnn.HHHHHHHH.HHHHHHHH

C类地址
192.  0.  1.  1 = 11000000.00000000.00000001.00000001
223.255.255.254 = 11011111.11111111.11111111.11111110
                  110nnnnn.nnnnnnnn.nnnnnnnn.HHHHHHHH

D类地址
224.  0.  0.  1 = 11100000.00000000.00000000.00000001
239.255.255.254 = 11101111.11111111.11111111.11111110
                  1110XXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX

  由于可用的网络号不能全0,且A类网络号127被用作环回地址,因此可用的A类网络有$2^{8-1}-2=126$个,每个网络可以容纳$2^{24}-2$台主机,地址范围是$1.0.0.1\sim 126.255.255.254$;
  由于 128.0.x.x 被认为是保留地址,可用的B类网络有$2^{16-2}-1$个,每个网络可容纳$2^{16}-2$台主机,地址范围是$128.1.0.1\sim 191.255.255.254$
  由于 192.0.0.x 被认为是保留地址,可用的C类网络有$2^{24-3}-1$个,每个网络可容纳$2^{8}-2$台主机,地址范围是$192.0.1.1\sim 223.255.255.254$

网络内的可分配主机数总是$2^N-2$(除去全0全1),N为主机号位数

其实关于B类保留地址128.0.x.x和C类保留地址192.0.0.x具有的争议,不必太过纠结,还是以谢希仁的计算机网络为参考:

  实际上B类网络地址128.0.0.0是不指派的,而可以指派的B类最小网络地址是128.1.0.0

谢希仁《计算机网络(第七版)》

一些特殊的ip地址:

  • 0.0.0.0:代表所有未知的的主机和目的网络集合,常作为默认路由
  • 127.x.x.x:环回测试地址,别名localhost
  • 255.255.255.255:本网广播地址
  • 广播地址:主机号全1,网络号特定值,如192.168.2.255
  • 一个网络:主机号全0,网络号特定值,如192.168.1.0

广播与多播:

  • 广播:“一对所有”,向网络内的所有主机发送数据
  • 多播(组播):“一对一组”,向一个组内的所有主机发送数据,属于多播组的设备会被分配一个D类地址

私有地址和公有地址:

  • 公有:向因特网信息中心注册申请的地址,可直接访问Internet
  • 私有:非注册地址,只能作为内部网络
    • A类:10.x.x.x
    • B类:172.16.x.x ~ 172.31.x.x
    • C类:192.168.x.x

子网掩码
  • 将主机号的高几位作为子网号,即 IP地址 = 网络号+子网号+主机号
  • 将IP地址与子网掩码相得到网络的地址
  • 子网掩码的表示:
    • 1 - 网络号
    • 0 - 主机号

例:把网络 150.100.100.0 划为6个子网。

分析:

  • 不难看出这是个C类网络,主机号占最后一个字节
  • 将主机号最高3位定义为子网号(因为 $2^2<6<2^3$)

  因此子网掩码为$11111111.11111111.11111111.11100000$,即$255.255.255.224$
  如此一共可分出8个子网,可将子网号为000和111弃用:

网络地址主机IP范围
$150.100.100.32$$150.100.100.33\sim 150.100.100.62$
$150.100.100.64$$150.100.100.65\sim 150.100.100.94$
$150.100.100.96$$150.100.100.97\sim 150.100.100.126$
$150.100.100.128$$150.100.100.129\sim 150.100.100.158$
$150.100.100.160$$150.100.100.161\sim 150.100.100.190$
$150.100.100.192$$150.100.100.193\sim 150.100.100.222$

注:关于子网号能否全0或全1:

  • 就学习的角度而言,还是要视子网号不能全0和全1;
  • 而下文中的CIDR中是可以的。(因为网络号和子网号作为了一个整体)

  虽然根据已成为互联网标准协议的 RFC950 文档,子网号不能全1或全0,但随着无分类域间路由选择CIDR的广泛使用,现在的全0和全1子网也可以使用了,但一定要谨慎使用,要弄清你的路由器的路由选择软件是否支持全0或全1的子网号这种比较新的用法。

谢希仁《计算机网络(第七版)》

无分类编址CIDR
  • 消除A、B、C类IP地址的概念
  • 地址的构成
    • 网络前缀
    • 主机地址
  • 地址的表示:<IP-address>/<net-preffix>(eg. 192.168.2.7/24

IPv6 vs IPv4
  • 地址空间:32b –> 128b
  • 移出了校验和字段(减少处理时间)
  • 可选字段移出了首部,变成了扩展首部(扩展首部不进行检查)
  • 支持自动配置IP地址,不需要DHCP
  • IPv6首部必须是8B倍数;IPv4首部4B倍数
  • IPv6只能在主机处分片;IPv4能在主机和路由器处分片

ARP协议

要求:

  • 作用:IP地址 –> MAC地址
  • 说出传送数据的大致过程(ARP广播)

数据发送过程

同一网段
  1. 主机A通过自身的ARP缓存查找B的MAC
  2. 若找不到,则发送ARP广播
    1. 将目标MAC地址填写为FF.FF.FF.FF.FF.FF
    2. 向同一网段的主机广播
    3. 只有主机B接到了广播才单播响应
    4. 主机A和B更新ARP缓存
  3. 主机A进入接口层发送数据给B
不同网段
  1. 主机A,如上地,通过ARP广播或缓存得到默认网关的MAC地址
  2. 主机A填写地址并传输数据给默认网关
    • 主机B的IP地址
    • 默认网关的MAC地址
  3. 网关路由解封装查看目的地址并填写MAC再封装,同样按照以上方式查找和转发数据

ICMP协议

要求:

  • 作用:报告网络情况
  • 常见报文类型

  用于报告网络是否流畅、主机是否可达、路由是否可用等信息,常见如ping、traceroute命令

常见报文类型:

  • 差错报告报文
    • 3 - 终点不可达
    • 11 - 超时(数据包TTL=0)
  • 查询报文
    • 8 - echo 请求
    • 0 - echo 响应

路由选择协议

要求:

  • 知道路由器和交换机的区别
  • 稍微了解RIP与OSPF区别

路由器与交换机的区别:

  • 网络层次
    • 交换机:链路层
    • 路由器:网络层
  • 作用
    • 交换机:组建局域网
    • 路由器:不同网络间数据转发
  • 广播域隔离
    • 交换机:不隔离
    • 路由器:隔离

路由器包括了交换机的功能

内部网关协议

RIP
  • 仅相邻路由器交换路由表
  • 在若干次更新后,所有路由器都会得到
    • 系统内通向各个网络的最短距离(跳数)
    • 对应的下一跳路由
  • 每30s交换一次

特点:网络故障发现慢

OSPF
  • 路由器向系统内所有的路由器广播链路数据(洪泛法)
  • 路由器通过所形成的系统拓扑结构,形成路由表(Dijkstra)
  • 链路状态变化时才发送

RIP与OSPF的主要不同:

  • 路由表
    • RIP:邻接节点
    • OSPF:系统拓扑结构
  • 故障发现
    • RIP:收敛慢
    • OSPF:收敛快

动态主机配置协议 DHCP

要求:

  • 了解DHCP协议的作用、主机获取ip的大致过程
  • 作用:动态分配局域网的IP地址
  • 应用层协议

过程:(广播方式交互)

  1. 主机发现DHCP服务器
  2. DHCP服务器响应并拟分配IP给主机
  3. 主机向服务器请求提供的IP地址
  4. 服务器确认请求


传输层

UDP协议

要求:

  • 了解UDP协议的特点和应用
  • 能说出与TCP协议的区别

特点:

  • 无连接、不可靠
  • 面向报文(一次性传输少量数据)
伪首部

  伪首部用于计算校验和,不会向上或向下递交

伪首部的各个字段:

  1. 源IP地址
  2. 目的IP地址
  3. 固定全0的一个字节
  4. IP数据报首部协议字段是17
  5. UDP的首部8B + 数据部分 (不含伪首部)
UDP vs TCP
  • 拥塞控制
    • UDP:无,适合实时应用
    • TCP:有
  • 首部大小
    • UDP:8B
    • TCP:20B

TCP 协议

要求:

  • 能说出TCP协议的特点
  • 能说出常见字段、常见控制位的作用
  • 熟练讲出三握四挥的过程
  • 了解可靠传输、流量控制、拥塞控制机制

特点:

  • 面向连接(不能广播或组播)
  • 可靠有序,不丢不重

套接字:socket = ip:port

控制位
  • URG:配合紧急指针将具有优先级的数据先发出
  • ACK:确认号有效(在建立连接后,所有报文ACK=1)
  • PSH
  • RST
  • SYN:SYN=1 表明是一个连接请求报文
  • FIN:FIN=1 表明要求释放连接

口诀:Unskilled Attackers Pester Real Security Folks

其他字段
  • 窗口:允许发送方发送的字节量
  • 校验和:用于校验首部+数据
    • 校验时需要加上伪首部,协议字段为6
  • 紧急指针
  • 选项
三次握手

注:其中x、y均为随机值

  1. client发送连接请求报文段SYN(无数据)
  2. server为TCP连接分配缓存和变量,并向client返回同步并确认报文段SYN+ACK(无数据)
  3. client为TCP连接分配缓存和变量,并向server返回确认的确认ACK(可以携带数据)

SYN 洪泛攻击:
 攻击者发送TCP SYN,即三次握手的第一个数据包,当服务器返回ACK时,攻击者不予确认,因此这个TCP连接就处于挂起状态。
  因此一旦攻击者如此发送大量SYN数据包时就会消耗服务器资源,从而导致服务器宕机。

为什么握手要三次?

  • 因为TCP是全双工的,所以至少要两次握手来保证两个方向都通。因为两次握手后,server并不知道向client传输的信道是否通畅,所以需要收到来自client的ack来确认。
  • 反例:设想一种情况:若是两次握手的前提下,网络上还残留的超时的syn连接请求报文抵达了服务端,于是server再给予client确认报文,就会建立起意外的TCP连接。

如果第三次握手失败会怎么样?

  • 若server迟迟收不到来自client的ack,则不会进入ESTABLISH状态,无法传输数据,server根据定时器发送第二次握手的syn+ack报文段,让client重新确认。
  • 若一直不成功超时,则server会向client发送RTS报文,并进入CLOSE状态关闭连接。

四次挥手

注:MSL表示最长报文段寿命

  1. client发送释放报文段FIN,主动关闭TCP连接
  2. server回复确认报文段ACK,client到server方向的连接关闭
  3. server主动又发出释放报文段FIN+ACK
  4. client回复确认报文段ACK,等待2MSL后关闭连接

为什么要挥手四次?

  • server收到client的FIN报文表示client已经发完数据,而server可能仍有剩余数据要传送,所以要等传完数据再主动关闭。即server为了传输剩余数据,将“第二次挥手”分为了两步。

为什么最后client要等待2MSL?

  • 如果client最后的ACK报文丢失,那么经过2MSL,client就会收到来自server的重传FIN+ACK报文
  • 另外就是为了使 本连接所产生的 所有报文段 都从网络中过期消失

TCP保活计时器(keep alive timer):

  • 作用:避免 当client故障不响应,server白等下去
  • 当server通常两小时没收到client的数据时,server就发送探测报文段,之后每隔75秒发送一次。若一连发送10个报文段都没有响应,server就会认为client出了故障,关闭这个连接。

可靠传输
  • 校验和(伪首部)
  • 序号(按字节编号)
  • 确认号(默认累计确认)
  • 超时重传(动态自适应)
数据传输方式
  • 交互数据流
    • 停止等待ARQ协议
  • 成块数据流
    • 滑动窗口
    • 连续ARQ协议(流水线)
      • 后退N帧协议GBN
      • 选择重传协议SR

后退N帧协议GBN:

  • $receive-window = 1$   => 无序丢弃
  • 累计确认

选择重传协议SR:

  • $receive-window \leqslant 2^{n-1}$
  • 逐一确认

流量控制
  • 滑动窗口机制(Sender-side window = min{CWND, RWND}
    • cwnd:拥塞窗口
    • rwnd:接受窗口

发送rwnd=0后的“死锁”隐患:

  • 问题:receiver在发送win=0后,若发送的win=100报文段丢失,则会造成双方互相等待的局面。
  • 解决:TCP规定在收到对方接受窗口为0时,启动一个持续定时器周期性的发送探测报文。

拥塞控制

  防止过多的数据注入到网络中而过载。

  • 慢启动和拥塞避免
    • 起始cwnd=1,指数增长
    • 超过ssthresh阀值,加法增长
    • 网络超时,ssthresh阀值减半,cwnd=1重新开始
  • 快速重传和快恢复
    • 一旦sender连续收到3个重复的ACK报文段,将ssthresh阀值减半
    • ssthresh开始执行加法增长


附录 —— TCP三次握手抓包

抓包

工具:

  • 网络扫描:nmap
  • 抓包:wireshark

同一局域网内,假设手机tcp套接字为$192.168.2.2:62078$,电脑tcp套接字为$192.168.2.5:44876$

打开wireshark抓包,加入过滤表达式ip.addr == 192.168.2.2 and tcp.port == 62078

电脑使用TCP扫描 向手机建立TCP连接:

nmap -sT 192.168.2.2 -p 62078

  于是,可以得到以下与三次握手的相关信息:

No.     Source          Destination     Protocol        Length      Info

149        192.168.2.5        192.168.2.2        TCP                74            44876 → 62078 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=3875296996 TSecr=0 WS=128

151        192.168.2.2        192.168.2.5        TCP                78            62078 → 44876 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1460 WS=64 TSval=1021362622 TSecr=3875296996 SACK_PERM=1

152        192.168.2.5        192.168.2.2        TCP                66            44876 → 62078 [ACK] Seq=1 Ack=1 Win=64256 Len=0 TSval=3875297093 TSecr=1021362622

报文分析

  不妨分析一下第一个报文:

98 10 e8 af 7b 78 d8 cb 8a b4 84 eb 08 00 45 00
00 3c b5 b2 40 00 40 06 ff b1 c0 a8 02 05 c0 a8
02 02 af 4c f2 7e b6 0b e1 5b 00 00 00 00 a0 02
fa f0 50 a3 00 00 02 04 05 b4 04 02 08 0a e6 fc
56 e4 00 00 00 00 01 03 03 07
链路层

Ethernet II帧的格式为:

数据: 98 10 e8 af 7b 78 d8 cb 8a b4 84 eb 08 00

  • Destination: 98:10:e8:af:7b:78
  • Source: d8:cb:8a:b4:84:eb
  • Type: IPv4 (0x0800)

其中帧前序和FCS已被底层设备检查过滤,并没有提供给wireshark

网络层

IP协议头部格式为:

数据: 45 00 00 3c b5 b2 40 00 40 06 ff b1 c0 a8 02 05 c0 a8 02 02

VersionIPv40x4
IHLHeader Length5 × 32 bits = 20 bytes0x5
DSCP & ECNnone0x00
Total Length60B0x003c
Identificationip fragment id465140xb5b2
Flags
  • Reserved
  • Don’t Fragment(DF)
  • More Fragments(MF)
  • R=0
  • DF=1
  • MF=0
0b010
Flag Fragmentno fragment0b0000000000000
Time To Livettl640x40
Protocoltcp0x06
Header Checksum0xffb10xffb1
Source IP Address192.168.2.50xc0a80205
Destination IP Address192.168.2.10xc0a80202
Optionsnone(IHL=5)

各种长度单位:

  • 首部 - 4B
  • 总长度 - 1B
  • 片偏移 - 8B
传输层

TCP协议头部格式:

数据: af 4c f2 7e b6 0b e1 5b 00 00 00 00 a0 02 fa f0 50 a3 00 00 02 04 05 b4 04 02 08 0a e6 fc 56 e4 00 00 00 00 01 03 03 07

Source port448760xaf4c
Destination port620780xf27e
Sequence number30542318990xb60be15b
Acknowledgment numbernone(ACK not set)0x00000000
Data offset100xa
Reserved0000b000
Flags
  • NS=0
  • CWR=0
  • ECE=0
  • URG=0
  • ACK=0
  • PSH=0
  • RST=0
  • SYN=1
  • FIN=0
0b000000010
Window Size642400xfaf0
Checksum0x50a30x50a3
Urgent pointernone(URG not set)0x0000
Options0x020405b40402080ae6fc56e40000000001030307
TCP校验和计算

伪首部格式:

经过手动计算对比,得到伪首部各个参数:

  • Source address: 192.168.2.5(0xc0a80205
  • Destination address: 192.168.2.2(0xc0a80202
  • Protocol: TCP(0x06
  • TCP length: 40B(0x28

校验和计算:

  1. 数据报checksum字段置为0
  2. 首部每16位进行二进制求和(TCP需要加上伪首部)
  3. 将这个和高16位部分 加回到低16位
  4. 将得到的和 取反码

将数据字段中的checksum字段按0x0000处理,得到数据c0 a8 02 05 c0 a8 02 02 00 06 00 28 af 4c f2 7e b6 0b e1 5b 00 00 00 00 a0 02 fa f0 00 00 00 00 02 04 05 b4 04 02 08 0a e6 fc 56 e4 00 00 00 00 01 03 03 07,最后计算可得0x50a3

0xc0a8    ->        1100000010101000
0x0205    ->        0000001000000101
0xc0a8    ->        1100000010101000
0x0202    ->        0000001000000010
0x0006    ->        0000000000000110
0x0028    ->        0000000000101000
0xaf4c    ->        1010111101001100
0xf27e    ->        1111001001111110
0xb60b    ->        1011011000001011
0xe15b    ->        1110000101011011
0x0000    ->        0000000000000000
0x0000    ->        0000000000000000
0xa002    ->        1010000000000010
0xfaf0    ->        1111101011110000
0x0000    ->        0000000000000000
0x0000    ->        0000000000000000
0x0204    ->        0000001000000100
0x05b4    ->        0000010110110100
0x0402    ->        0000010000000010
0x080a    ->        0000100000001010
0xe6fc    ->        1110011011111100
0x56e4    ->        0101011011100100
0x0000    ->        0000000000000000
0x0000    ->        0000000000000000
0x0103    ->        0000000100000011
0x0307    ->     +) 0000001100000111
--------------------------------
            111 1010111101010101
--------------------------------
             ~) 1010111101011100
--------------------------------
0x50a3    <-        0101000010100011
-------------本文结束-------------
0%