《计算机网络》笔记
一、体系结构

二、物理层
跳过
三、链路层
3.1 三个基本问题
封装成帧
将网络层的IP数据包拆分,加上帧首部和帧尾部封装成帧后,再发送出去,一般使用控制字符来表示帧定界符:

透明传输
链路层应该对网络层透明,即网络层不管给什么数据,链路层都是可以发送过去的。但是有这样的情况:网络层给的数据中,也包含了跟帧定界符一样的字符,该怎么判定这个字符是要传输的数据,还是帧定界符呢?
下图中出现帧判定错误:

答案是使用转义字符,通过字节填充的方式,转义掉数据中的控制字符。如果数据中也包括转义字符,则再在前面加一个转义字符:

差错校验:
链路层在传输数据时,可能会出现两种错误:
- 传输差错:在一批数据中会传输多个帧,出现帧丢失、重复或顺序错误等情况
-
比特差错:一个帧中的某个比特数据出错,
0变1,1变0
传输差错
OSI要求链路层是可靠的,但实际上链路层出错的概率很低,当前实现上都已经不再使用帧确认、重传了,这部的处理交给了上层协议,所以链路层实际上是不可靠的。
比特差错
将数据分组,通过CRC校验计算帧校验序列,附加到在每组数据的后面,再封装成帧后发送出。接收端进行校验,丢弃出错的帧。可以认为“凡是接收端的链路层所接受的帧均无差错”。
3.2 交换机
交换机是多接口网桥,通过自学习完善转发表。

四、网络层

- ARP(Address Resolution Protocol):地址解析协议
- RARP(Reverse Address Resolution Protocol):逆地址解析协议
- ICMP(Internet Control Message Protocol):网际控制报文协议
- IGMP(Internet Group Management Protocol):网际组管理协议
4.1 ARP

4.2 IP数据报格式

- 版本:
IPV4或IPV6。 - 首部长度:
20字节~60字节,必须是4字节的整数倍,不足4字节时填充。 - 区分服务:一般不使用。
- 总长度:首部和数据之和的长度,最大为216-1=65535字节。当IP数据报大于
链路层的MTU时,需要对IP数据报进行分片,这时总长度指的是分片后每个分片的首部长度和数据长度的总和。 - 标识:分片后为了识别是否是同一个数据报。
- 标志:
后面是否还有分片和能否分片。 - 片偏移:分片在原分组中的相对偏移位置。

- 生存时间:IP数据报在网络中可经过多少个路由器,每经过一个路由器就减
1,为0时则丢弃数据报,最大值255。若设为1,表示只在本局域网中传送。 - 协议:IP数据报携带的数据,是哪种协议的,以便接收端的主机知道将数据上交给哪个处理过程,常用的协议如下:

- 首部校验和:只校验IP数据报的首部,不包括数据部分。采用反算术运算。
4.3 分组转发



4.4 子网划分
子网划分
在一个网络中,将IP地址中的主机号部分,取前几位作为子网编号,对网络进行划分。子网划分增加了网络的灵活性,却减少了网络中的主机总数。

子网掩码
IP地址与子网掩码进行与运算,得到网络地址。

使用子网时的分组转发


4.5 CIDR
CIDR其实就是将IP地址分成可变长度的两部分,前面是网络前缀,后面是主机号。用<IP地址>/<前缀长度>这样的记法。

在路由表中进行匹配时,从匹配结果中选择具有最长网络前缀的路由,使用二叉线索树来查找:


由于上面用的是“唯一前缀”,并非“网络前缀”,所以找到叶子节点后,再将目的地址和叶子节点的子网掩码进行与运算,看是否匹配。至于如何从路由表的IP地址中,计算出所有的唯一前缀,是一道算法题:trie树,关键字“字符串最短唯一前缀”。
五、传输层
5.1 UDP
无连接、不可靠,面向报文,即应用层下来的数据,直接添加头部就交给网络层,没有合并和拆分。

UDP校验时,把首部和数据部分一起校验,IP数据报是只校验首部的。
5.2 TCP
面向连接、可靠,点对点,全双工通信,字节流。

停止等待协议
- 发送端:发送一个分组,等待确认,分组被保存而不是直接删除
- 接收端:正确接收分组,则发送确认,错误或丢失分组则不发送
- 发送端:收到确认就删除分组,超时未收到就重新发送


这种可靠传输协议也叫自动重传请求ARQ(Automatic Repeat-reQuest)。停止等待协议很慢,信道利用率也很低,所以使用流水线传输,即连续ARQ协议和滑动窗口协议。


连续ARQ协议



5.3 TCP报文格式

几个重要字段:
- 序号:本报文的第一个数据字节的序号。TCP以字节流的方式发送数据,是字节的顺序编号,范围1~232-1,超出后继续从0开始
- 确认号:希望收到下一个报文的序号
- 紧急位URG(URGent):高优先级数据,无需排队尽快发送
- 确认位ACK(ACKnowlegment)
- 同步位SYN(SYNchronization)
- 终止FIN
- 窗口大小:动态调整接收方的接口窗口大小,用来进行流量控制和拥塞控制
5.4 流量控制:滑动窗口




Ref
- https://media.pearsoncmg.com/aw/ecs_kurose_compnetwork_7/cw/content/interactiveanimations/selective-repeat-protocol/index.html
- http://v.youku.com/v_show/id_XNDg1NDUyMDUy.html
5.5 拥塞控制
- 拥塞窗口cwnd:发送方维持的一个窗口,大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口等于拥塞窗口。只要没有出现拥塞,发送方就让拥塞窗口增大一点,出现拥塞,就减小一点。
- 传输轮次:把cwnd内的报文都发送出去,并被接收确认接收
慢开始
由于对网络负荷的情况不清楚,先探测一下,由小到大逐渐增大发送窗口,每经过一次传输轮训,拥塞窗口cwnd就加倍。
拥塞避免
让cwnd缓慢增大,每次加1,线性增长,而不是加倍



快重传
接收方每收到一个失序的报文,就立即发出重复确认,而不用等待自己发送数据时才进行捎带确认。
发送方一连收到三个重复确认就立即重传对方尚未收到的报文。

快恢复
发送方一连收到三个重复确认时,就“乘法减小”,把ssthresh减半,然后执行拥塞避免算法,“加法增大”

5.6 三次握手与四次挥手
建立连接:


释放连接:

为什么连接的时候是三次握手,关闭的时候是四次挥手呢?因为发送FIN时,只是表示自己这一方不再有数据要发送,但是对方发送的数据,还是需要继续接收,直到对方也发送FIN后才可以断开连接。