0.中继设备

  • 物理层中继系统:转发器(repeater)。
    数据链路层中继系统:网桥(bridge)。
    网络层中继系统:路由器(router),路由器连接了多个网络,所以至少有2个以上IP地址。
    网络层以上的中继系统:网关(gateway)。
    0.1 各层数据
    数据包(packet):应用层;
    段(segment):传输层;
    IP数据报(datagram):网络层,也有人称IP数据包
    *数据帧(frame):
    数据链路层;

    1.物理层:

    2.数据链路层:

    2.1 使用的主要是点对点信道和广播信道两种

    2.2 传输的协议数据单元是帧

    2.3 三个基本问题是:封装成帧,透明传输和差错检测

    1. **封装成帧:**在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能**根据首部和尾部的标记,从比特流中识别帧的开始和结束**。MTUMaximum Transfer Unit):帧数据部分长度上限,**链路层MTU1500字节**<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510356365-acc2cab1-92a0-4645-91ed-d8a9903331e6.png#height=266&id=Ac7NN&originHeight=314&originWidth=874&originalType=binary&ratio=1&status=done&style=none&width=740)<br /> **透明传输:**当数据部分是非ASCII码的文本文件时(如class文件),如果数据中的某个字节的二进制代码恰好是帧尾部控制字符,那么就会把帧的后面部分丢弃,这种情况就不是透明传输。<br /> **解决:**字节填充法——**发送端的数据链路层在数据**中出现控制字符"SOH"或"EOT"的前面插入一个转义字符"ESC"。而在**接收端的数据链路层**在将数据送往网络层之前删除这个插入的转义字符。当然如果转义字符"ESC"也出现在数据当中,那么解决的方法仍然是在转义字符的前面插入一个转义字符,所以,当接收到连续的两个转义字符的时候,就去删除其中前面的一个。 <br /> ![image.png](https://cdn.nlark.com/yuque/0/2020/png/1266758/1595853089641-6835da27-4150-4862-8f1a-fc4e4ce7d51d.png#height=213&id=IR6eF&margin=%5Bobject%20Object%5D&name=image.png&originHeight=213&originWidth=611&originalType=binary&ratio=1&size=139223&status=done&style=none&width=611)<br /> **差错检测:**数据链路层广泛使用了循环冗余检验(CRC)的检错技术,在IP数据报后添加2字节的帧检验序列FCS。<br /> CRC的基本思想就是将传输的数据当作一个位数很长的数,将这个数除以另外的一个数,得到的余数作为校验数据附加到原数据后面。<br /> 在数据链路层若仅仅使用CRC差错检验技术,则只能做到对帧的无差错接收,不会检查ip数据报是不是正确的(只能保证数据链路层传输数据时不发生错误)。

    2.4 PPP协议(Point-to-Point Protocol,属于数据链路层的点对点信道):

    用户计算机和ISP(运营商)进行通信时所使用的数据链路层协议,数据链路层三个基本问题它都支持
    PPP协议有三个组成部分:
    (1)数据链路层协议:IP数据报封装到串行链路的方法
    (2)链路控制协议LCP(Link Control Protocol):用来建立并维护数据链路连接,身份验证(运行商使用)
    (3)网络控制协议NCP:支持不同的网络层协议,如IP
    计算机网络 - 图1
    PPP协议帧格式:数据链路层的三个基本问题是:封装成帧,透明传输和差错检测都支持
    计算机网络 - 图2

    2.5 CSMA/CD(Carrier Sense Multiple Access/Collision Detect,属于数据链路层的广播信道):载波监听多路访问/冲突检测方法

    1. 特点是:发送前先监听,边发送边监听,一旦发现总线上出现了碰撞,就立即停止发送。然后按照退避算法等待一段随机时间后再次发送,推迟的平均时间随着重传次数而增大,退避时间的单位是一个争用期的时间长度(信号的双程传播所需要的时间)
    2. ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510356525-89b6dc95-a628-43c6-bc62-37da855c12a1.png#height=171&id=Hd01u&originHeight=171&originWidth=601&originalType=binary&ratio=1&status=done&style=none&width=601)

    2.6 交换机

  • 交换机具有自学习能力,学习的是交换表的内容,交换表中存储着 MAC 地址到接口的映射
  • 工作原理:

    • 交换机有 4 个接口,主机 A 向主机 B 发送数据帧时,交换机把主机 A 到接口 1 的映射写入交换表中
    • 为了发送数据帧到 B,先查交换表,此时没有主机 B 的表项,那么主机 A 就发送广播帧
    • 主机 C 和主机 D 会丢弃该帧,主机 B 回应该帧向主机 A 发送数据包时,交换机查找交换表得到主机 A 映射的接口为 1,就发送数据帧到接口 1,同时交换机添加主机 B 到接口 2 的映射

      3.网络层

      3.1 网络层的设计思路

  • 网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务

  • 网络在发送分组时不需要先建立连接。每一个分组(即 IP 数据报)独立发送,与其前后的分组无关(不进行编号)
  • 网络层不提供服务质量的承诺。即所传送的分组可能出错、丢失、重复和失序(不按序到达终点),当然也不保证分组传送的时限。
  • 优点:路由器可以做的简单便宜,网络造价降低。可靠的进程通信由主机的运输层负责(包括差错处理、流量控制等)

    3.2 数据在互联网中的传送

    1. ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510356570-2638216f-1171-4e64-886b-3a7d0a421671.png#height=210&id=N8Nyi&originHeight=210&originWidth=958&originalType=binary&ratio=1&status=done&style=none&width=958)<br /> 1.**应用层**要发送的数据在**传输层**被分成段1,2,3并编号<br /> 2.**网络层**将数据段增加**发送端IP地址**和**接收端IP地址**封装成包(IP数据报)<br /> 3.**数据链路层**将数据报增加**发送端MAC地址**和**路由器MAC地址**<br /> 4.**物理层**将数据帧转化成比特流发送<br /> 5.**交换机**工作在**数据链路层**,读取比特流,<br /> 5.1 如果接收端IP地址和发送端IP是同一个网络下(根据IP地址和子网掩码确定),则根据**ARP协议**找到**接收端MAC地址**<br /> 5.2 如果不是同一个网络下,则根据**ARP协议**找到网络中一个**路由器MAC地址**,交给路由器进行路由选择<br /> 6.**路由器工作在网络层**,发送的数据帧中**接收端的MAC是FF**,即**广播**,所有路由器都可以接收该请求<br /> 7.确定接收端MAC地址后,接收主机逐层解析数据,传输层只有数据段<br /> 8+.**路由选择**的时候只用**下三层协议**

    3.3 IP协议( TCP/IP 体系中两个最主要的协议之一)

  • IP 数据报的格式

    • IP协议主要内容围绕在IP数据包格式中
    • 一个 IP 数据报由首部数据两部分组成
    • 首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的
    • 在首部的固定部分后面是一些可选字段,其长度是可变的
    • 链路层一个数据帧最大长度是1500字节,除去固定部分20字节网络层分片后最多有1480字节用来传输数据,即每1480字节数据就要分片

      1. ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510356624-b55b8382-ba2b-4246-8eed-cf57f9bdb1fe.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=341&id=sEhpq&originHeight=341&originWidth=683&originalType=binary&ratio=1&status=done&style=none&width=683)
  • IP数据报首部格式

    1. ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510356694-e3c4d3c8-6347-42d8-9d7b-681c9601c548.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=413&id=u3ToU&originHeight=413&originWidth=689&originalType=binary&ratio=1&status=done&style=none&width=689)<br /> **版本:**占 4 个比特,指 IP 协议的版本,目前的 IP 协议版本号为 4 (即 IPv4)<br /> **首部长度:**占 4 个比特,可表示的最大数值,15 个单位(一个单位为 4 字节),因此 IP 的首部长度的最大值是 60 字节<br /> **区分服务:**占 8 个比特,只有在使用区分服务时,这个字段才起作用,在一般的情况下都不使用这个字段<br /> **总长度:**占 16 个比特,首部和数据之和的长度,单位为字节,因此数据报的最大长度2^16=65535=64K字节。**分片后**总长度必须不超过最大传送单元 MTU<br /> **标识:**占 16 个比特,一个计数器,记录数据报分片后的标识。每产生一个数据报,计数器就+1,并赋值给标识字段。等到重组数据报时就是将相同标识符的数据报重组成一个数据报<br /> **标志:**占 3 个比特,目前只有前两位有意义,最低位MF (More Fragment)=1表示后面还有分片,MF=0表示最后一个分片,中间位DF (Don't Fragment=0时才允许分片<br /> **片偏移:**当前片在原分组中的相对位置<br /> **生存时间:**占8个比特,TTL (Time To Live),数据报在网络中可通过的路由器数的最大值<br /> **协议:**占8个比特,此数据报携带的数据使用何种协议,以便目的主机的 IP 层将数据部分上交给哪个处理过程<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510356731-cffb3a6f-2a16-4f44-87ca-7fdaa05000d0.png#height=237&id=VpnVW&originHeight=481&originWidth=626&originalType=binary&ratio=1&status=done&style=none&width=308)<br /> **首部检验和:**占16比特,检验数据报的首部,不检验数据部分<br /> **源地址/目的地址:**占32比特,即,对应IP地址32位<br /> **可变部分:**可以占1-40字节,实际上很少使用,占0字节

    3.4 IP 协议配套使用的还有三个协议,其中ARP属于网络层偏下层,ICMP和IGMP属于网络层偏上层,会封装成IP数据报发送

    计算机网络 - 图3

    3.5 ARP地址解析协议(Address Resolution Protocol):

    1. 3.5.1 解决同一个局域网上的主机或路由器的 IP 地址和MAC地址的映射问题,命令:arp -a,网络层的底层协议<br /> 3.5.2 不管网络层使用的是什么协议,在实际网络的**链路上传送数据帧时**,最终还是**必须使用硬件地址**<br /> 3.5.3 **每一个主机**都设有一个 **ARP 高速缓存**(ARP cache),里面有所在的**局域网**上的各主机和路由器的 **IP 地址**到**硬件地址**的**映射表**<br /> 3.5.4 当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 **ARP 高速缓存**中查看有无主机 B IP 地址。如有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址<br />3.5.5 ARP攻击:ARP缓存表会过期,所以监听者可以通过ARP协议获取要监听的主机的MAC地址,并且告诉其他主机自己的MAC就是被监听的主机的MAC

    3.6 ICMP网际控制报文协议(Internet Control Message Protocol):

    1. 3.6.1 IP 协议缺少一个**辅助机制**,即主机的管理和**查询机制**。在某些情况下,源主机需要确定另一个主机或者路由器是否是活跃的,对于不活跃的主机,就没有必要再向它发送数据报了<br /> 3.6.2 ICMP 协议有自己的一套报文格式,且**ICMP 报文是放在 IP 数据报中的数据区域发送的**<br /> 3.6.3 **Ping**的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。<br /> 3.6.4 **Traceroute**是用来查看所经过的每一跳路由,可以具体判断时延变大或者丢包的点<br /> * 源主机向目的主机发送一连串的 IP 数据报。第一个数据报 P1 的生存时间 TTL 设置为 1,当 P1 到达路径上的第一个路由器 R1 时,R1 收下它并把 TTL 1,此时 TTL 等于 0R1 就把 P1 丢弃,并向源主机发送一个 ICMP 时间超过差错报告报文;<br /> * 源主机接着发送第二个数据报 P2,并把 TTL 设置为 2P2 先到达 R1R1 收下后把 TTL 1 再转发给 R2R2 收下后也把 TTL 1,由于此时 TTL 等于 0R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。<br /> * 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为**数据报封装的是无法交付的 UDP**,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。<br /> * 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510356807-d144ec80-ac25-437c-ad8f-d7cab7f1da96.png#height=194&id=V7YLI&originHeight=194&originWidth=456&originalType=binary&ratio=1&status=done&style=none&width=456)<br /> 3.6.4 **ICMP的报文格式**<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510356840-4ea83f26-ccfd-481f-86e2-3af9552ed4ce.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=361&id=PUzic&originHeight=361&originWidth=665&originalType=binary&ratio=1&status=done&style=none&width=665)<br /> **类型:**占8个比特,标识ICMP报文的类型,从类型值来看ICMP报文可以分为两大类。第一类是取值为1~127的差错报文,第2类是取值128以上的信息报文<br /> **代码:**占8个比特 ,标识对应ICMP报文的代码。它与类型字段一起共同标识了ICMP报文的详细类型<br /> **校验和:**这是对**包括ICMP报文数据部分**在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错(其计算方法与IP数据报头中的校验和计算方法是一样的)<br /> 3.6.5 ICMP报文的分类<br /> ICMP分为两类,一类是**ICMP查询报文**,另一类是**ICMP差错报文**<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510356891-b7b3e05d-ecca-45c0-ac3f-3183f096fa87.png#height=269&id=CeUqJ&originHeight=269&originWidth=627&originalType=binary&ratio=1&status=done&style=none&width=627)

    3.7 IGMP网际组管理协议(Internet Group Management Protocol):

    1. IGMP协议是让连接在本局域网上的多播路由器知道本局域网上是否有主机(严格来讲是主机上的某个进程)参加或者退出了某个多播组,下面会详细介绍

    3.8 IP地址的编码方式

    1. 3.8.1 IP 地址的编址方式经历了三个历史阶段:分类,子网划分,无分类,每次改进解决的问题之一都是路由表太大<br /> **分类**:二级IP地址——IP 地址 ::= {**< 网络号 >**, < 主机号 >}<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510356928-e0998ee2-cd2f-48c9-906a-39dc548120e3.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=328&id=y3Sz3&originHeight=392&originWidth=685&originalType=binary&ratio=1&status=done&style=none&width=574)<br /> **子网划分:**IP地址 ::= {<网络号>, **<子网号>**, <主机号>} <br /> * 划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络。<br /> * 划分子网只是把 IP 地址的**主机号 host-id 这部分进行再划分**,而不改变 IP 地址原来的网络号 net-id。<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510356997-aaa13338-551c-442a-bf33-ce189ed3e6e6.png#height=357&id=cU0nh&originHeight=357&originWidth=481&originalType=binary&ratio=1&status=done&style=none&width=481)<br /> **无分类:**无分类域间路由选择 **CIDR** (Classless Inter-Domain Routing)——IP地址 ::= {<网络前缀>, <主机号>}<br /> * 消除了传统 A 类、B 类和 C 类地址以及划分子网的概念,使用网络前缀和主机号对 IP 地址进行编码,**网络前缀的长度可以根据需要变化**<br /> * CIDR使用各种长度的“网络前缀”(network-prefix)来代替分类地址中的网络号和子网号。<br /> * IP 地址从三级编址(使用子网掩码)又回到了两级编址<br /> * 128.14.32.0/20 表示的地址块共有 2^12 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位)<br /> * 这个地址块的起始地址是 128.14.32.0

    3.9 路由聚合/构成超网

    1. * 一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个原来传统分类地址的路由<br /> * 路由聚合也称为构成超网(supernetting)<br /> * 前缀长度不超过 23 位的 CIDR 地址块都包含了多个 C 类地址(C类地址前缀长度是24位)<br /> * 这些 C 类地址合起来就构成了超网

    3.10 最长前缀匹配

    1. * 使用 CIDR 时,路由表中的每个项目由“**网络前缀**”和“**下一跳地址**”组成。在查找路由表时可能会得到不止一个匹配结果<br /> * 应当从**匹配结果**中选择具有**最长网络前缀的路由**:最长前缀匹配<br /> * **网络前缀越长**,其**地址块就越小**,因而路由就**越具体**

    3.11 二叉树加速查找路由表

    1. * 比如路由表存储有5个前缀 0100,0101,011,10110,10111<br /> * 对应的二叉树为:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357044-540b6cb1-d8e0-4bb9-8f7b-92c52ae23766.png#height=215&id=Mlqkv&originHeight=215&originWidth=210&originalType=binary&ratio=1&status=done&style=none&width=210)

    3.12 路由器结构

    1. * 路由器从功能上可以划分为:路由选择和分组转发<br /> * 路由器结构<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357122-654fa069-8a21-4605-83ff-9f3c96f6a622.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=395&id=ijKW6&originHeight=395&originWidth=686&originalType=binary&ratio=1&status=done&style=none&width=686)

    3.13 路由器分组转发流程

    1. (1)从数据报的首部提取目的主机的 IP 地址 D,得到目的网络地址 N<br /> (2)若 N 就是与此路由器直接相连的某个网络地址,则进行直接交付<br /> (3)若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给表中所指明的下一跳路由器<br /> (4)若路由表中有到达网络 N 的路由,则把数据报传送给路由表中所指明的下一跳路由器<br /> (5)若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器<br /> (6)报告转发分组出错

    3.14 路由选择协议

    1. * **基本概念:**<br /> **静态路由:**简单开销小,不能适应网络状态变化<br /> **动态路由:**复杂开销大,能适应网络状态变化<br /> *** 自治系统** AS(Autonomous System):一个网络单元,包含多个路由器,内部可以使用多种路由协议,但是对外使用一致的路由选择策略<br /> *** 内部网关协议 IGP** (Interior Gateway Protocol):一个自治系统内部使用的路由选择协议,如 **RIP协议**和**OSPF 协议**。<br /> *** 外部网关协议EGP** (External Gateway Protocol):源站和目的站处在不同的自治系统中,使用的协议,如**BGP**<br /> 注:历史原因,这里的可以认为网关和路由器是同义词(其实网关的概念更大,连接两个不同的网络即网关)

    3.15 内部网关协议——RIP协议(Routing Information Protocol)

    1. * 属于**动态路由协议**<br /> * RIP 是一种基于距离向量的路由选择协议。距离是指跳数,直接相连的路由器跳数为 1。跳数最多为 15,超过 15 表示不可达。<br /> * **要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录**<br /> * 封装成UDP数据报然后再封装成IP数据报发送<br /> * **距离向量算法:**<br /> (1) 对地址为 X 的相邻路由器发来的 RIP 报文,先修改报文中的所有项目,把下一跳字段中的地址改为 X,并把所有的距离字段加 1;<br /> (2) 对修改后的 RIP 报文中的每一个项目,进行以下步骤:<br /> (3) 若原来的路由表中没有目的网络 N,则把该项目添加到路由表中;<br /> (4) 否则:若下一跳路由器地址是 X,则把收到的项目替换原来路由表中的项目;<br /> (4.1) 否则:若收到的项目中的距离 d 小于路由表中的距离,则进行更新(如原始路由表项为 Net2, 5, P,新表项为 Net2, 4, X,则更新);<br /> (4.2) 否则什么也不做。<br /> (5) 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为不可达,即把距离置为 16。<br /> * **RIP协议的优缺点:**<br /> * RIP 协议实现简单,开销小。<br /> * 但是 RIP 能使用的**最大距离为 15**,限制了网络的规模。并且当**网络出现故障的消息传送到所有路由器的时间较慢**。交换的路由信息是路由器中的完整路由表,因而随着**网络规模的扩大**,**开销也就增加**

    3.16 内部网关协议——OSPF(Open Shortest Path First)

    1. * 也属于**动态路由协议**<br /> * 为了克服 RIP 的缺点而开发出来的,网络规模可以较大且开销较小,没有故障消息传得慢问题。<br /> * 向本自治系统中的所有路由器发送信息,这种方法是洪泛法<br /> * 发送的信息就是与相邻路由器的链路状态,链路状态包括与哪些路由器相连以及链路的度量,度量用费用、距离、时延、带宽等来表示<br /> * 只有当链路状态发生变化时,路由器才会发送信息<br /> * 所有路由器都具有全网的拓扑结构图,并且是一致的<br /> * RIP协议不同,直接封装成IP数据报发送

    3.17 外部网关协议——BGP

    1. * 也属于**动态路由协议**<br /> * 若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中<br /> * AS 之间的路由选择很困难,主要是由于<br /> * 互联网规模很大,各个 AS 内部使用不同的路由选择协议,无法准确定义路径的度量<br /> * AS 之间的路由选择必须考虑有关的策略,比如有些 AS 不愿意让其它 AS 经过<br /> * BGP 只能寻找一条比较好的路由,而不是最佳路由<br /> * BGP报文封装成TCP报文然后封装成IP数据报进行发送<br /> * 每个 **AS** 都必须配置一个**路由器作为BGP 发言人**,通过在两个相邻 BGP 发言人之间建立 **TCP 连接**来交换路由信息,如图<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357176-d463d586-4fa1-4dc8-90d6-e71922fccb8d.png#height=241&id=Nyyzg&originHeight=241&originWidth=502&originalType=binary&ratio=1&status=done&style=none&width=502)

    3.18 网际组管理协议 IGMP和多播路由选择协议

    1. * 多播可明显地减少网络中资源的消耗,如果单播的话会单播很多次很浪费<br /> * 在局域网上进行硬件多播<br /> * 为了使路由器知道多播组成员的信息,需要利用**网际组管理协议 IGMP**(Internet Group Management Protocol)<br /> * 连接在局域网上的多播路由器还必须和因特网上的其他多播路由器协同工作,以便把**多播数据报用最小代价传送给所有的组成员**。这就需要使用**多播路由选择协议**。<br /> * **IGMP 协议**是让连接在**本地局域网上的多播路由器**知道本局域网上是否有主机(严格讲,是**主机上的某个进程**)**参加或退出了某个多播组**<br /> * IGMP协议封装成IP数据报发送

    3.19 VPN(Virtual Private Network,虚拟专用网络)

    1. * 应对IP地址紧缺的解决方案之一,对内使用本地地址(如,192.169.0.1),对外使用全球地址。<br /> * 平时所说的是远程接入VPN(remote access VPN),类似学校用来下载文献的VPN<br /> * 如图,场所A的本地地址10.1.0.1向场所B的本地地址10.2.0.3通信的过程<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357217-82e3b8e9-4843-4924-8a4a-bb6d1c29b43e.png#height=260&id=UAuf7&originHeight=260&originWidth=678&originalType=binary&ratio=1&status=done&style=none&width=678)

    3.20 NAT(Network Address Translation,网络地址转换)

    1. 专用网内部的主机使用本地 IP 地址又想和互联网上的主机通信时,可以使用 NAT 来将**本地 IP 转换为全球 IP**

    4.运输层

    4.1 运输层协议概述

    4.1.1 进程之间的通信

    1. * 运输层向它上面的应用层提供通信服务,它属于**面向通信部分的最高层**,同时也是**用户功能中的最低层**<br /> * 两个**主机通信**实际上就是两个主机中的**应用进程通信**<br /> * **应用进程之间的通信**又称为**端到端的通信**,运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道<br />** ** * 运输层的一个很重要的功能就是**复用**和**分用**。应用层**不同进程的报文**通过**不同的端口**向下交到运输层,再往下就**共用网络层**提供的服务<br /> * 运输层协议和网络层协议的主要区别:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357269-5f562fc3-7620-43d9-9295-62d7c6784596.png#height=251&id=jja51&originHeight=251&originWidth=422&originalType=binary&ratio=1&status=done&style=none&width=422)

    4.1.2 运输层的两个主要协议

    1. (1) **用户数据报协议 UDP(User Datagram Protocol)**<br /> * UDP 传送的**数据单位**协议是 **UDP 报文**或**用户数据报**<br /> * 这种**逻辑通信信道**是一条**不可靠信道**<br /> (2) **传输控制协议 TCP(Transmission Control Protocol)**<br /> * TCP 传送的**数据单位**协议是 **TCP 报文段(segment)**<br /> * 尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种**逻辑通信信道**就相当于一条**全双工的可靠信道**<br />** ** * 命令netstat -n

    4.1.3 运输层的端口

    1. * 端口用一个 16 位端口号进行标志(TCP报文中的16位端口号)<br /> * 端口号只具有本地意义<br /> * 软件端口与硬件端口<br /> * 在协议栈层间的抽象的协议端口是软件端口<br /> * 路由器或交换机上的端口是硬件端口<br /> * 三类端口<br /> * 熟知端口,数值一般为 0~1023(2^10)<br /> * 登记端口号,数值为1024~49151(48*2^10),为没有熟知端口号的应用程序使用的。这个范围的端口号必须在 IANA 登记,以防止重复<br /> * 客户端口号或短暂端口号,数值为49152~65535(2^16),留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用

    4.2 用户数据报协议 UDP

    4.2.1 UDP 概述

    1. **用户数据报协议 UDP(User Datagram Protocol):**在 IP 的数据报服务之上增加了很少一点的功能,即**端口功能**和**差错检测功能**<br />** * 无连接的**,**尽最大可能交付**,**没有拥塞控制**<br />** * 面向报文(**对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部)<br /> * 支持**一对一**、**一对多**、**多对一**和**多对多**的交互通信<br /> * UDP 的首部开销小,只有 8 个字节<br /> * 一个数据包就能完成通信<br /> * (王者荣耀就是用的UDP)

    4.2.2 UDP 的首部格式

    计算检验和时,临时把”伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
    计算机网络 - 图4

    4.3 传输控制协议 TCP 概述

    1. * TCP(Transmission Control Protocol)是**面向连接**的,每一条 TCP 连接只能有两个端点<br /> * 提供**可靠交付**,有**流量控制**,**拥塞控制**<br /> * 提供**全双工通信**,**面向字节流**(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块)<br /> * 每一条 TCP 连接只能是点对点的(一对一),**不提供广播或多播服务**

    4.3.1 TCP面向流示意图

    计算机网络 - 图5
    注意:
    TCP 对应用进程一次把多长的报文发送到TCP 的缓存中是不关心的
    TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节
    * TCP 可以把太长的数据块划分短一些再传送。TCP 也可等待积累有足够多的字节后再构成报文段发送出去

    4.3.2 TCP连接

    1. * TCP 连接的端点叫做套接字(socket):套接字 socket = (IP地址: 端口号)<br /> * 每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定

    4.3.3 TCP 报文段的首部格式

    1. ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357408-b509aaaf-ff39-4096-a9b0-116751b46010.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=467&id=B6x1I&originHeight=467&originWidth=695&originalType=binary&ratio=1&status=done&style=none&width=695)<br /> **源端口/目的端口:**端口是运输层与应用层的服务接口,运输层的复用和分用功能都要通过端口才能实现<br />** 序号:用于对发送端字节流进行编号,本TCP报文数据部分首字节在整个文件中的序号**<br /> * 例如序号为 301,表示TCP数据部分第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。<br /> **确认号 ack:期望收到的下一个报文段的序号**<br />* 例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。<br /> * (**序号**是**本TCP报文**数据部分的首字节序号,**确认号**是成功接收**别人TCP报文**,并期待接收的下一个TCP报文中数据部分的首字节的序号)<br />* 因为不能控制TCP报文到达的顺序,所以使用序号+确认号实现将TCP报文恢复成文件时的有序<br /> **数据偏移:**指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度<br /> **优先发送 URG:**(urgent) 设置后发送端优先发送,而不是在缓存中排队<br /> **确认 ACK:**(Acknowledge) 当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。<br /> * ack指确认号,ACK指一个比特的标志位<br /> **优先读取 PSH:**设置后接收端优先读取,而不是在缓存中排队<br /> **重置 RST:**(reset) 设置意味着TCP会话出现严重错误,必须释放和重新连接<br /> **同步 SYN:**在连接建立时用来同步序号。**当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中SYN=1,ACK=1**<br /> **终止 FIN:**用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。<br /> **窗口 :**窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的<br /> **校验和:**检验范围包括首部和数据,和UDP类似,需要在TCP报文段前加上12字节的临时伪首部<br /> **紧急指针:**本报文段中紧急数据在数据部分中结束的位置(URG=1时才有效),数据部分中紧急数据放在前面<br /> **选项:**例如MSS(Maximum Segment Size),告诉TCP对象我的缓存能存数据字段的字节数最大值<br /> * TCP三次握手时可以互相确定对象的窗口大小和MSS大小

    4.3.4 各层的数据报的最大负载

    1. 运输层TCPTCP数据报用16比特表示数据部分长度,最大长度2^16=65535=64K字节,首部长度20字节,所以TCP报文最大负载65515<br /> 网络层:IP数据报也用16比特表示数据部分长度,首部长度也是20字节,所以TCP报文段最大负载为65515-20=65495字节

    4.3.5 可靠传输的工作原理

    TCP 连接的每一端设有窗口——发送窗口/接收窗口,窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小
    TCP 的可靠传输机制用字节的序号进行控制。TCP 所有的确认都是基于序号而不是基于报文段
    TCP 两端的四个窗口经常处于动态变化之中
    TCP连接的往返时间 RTT 也不是固定不变的,所以重传时间需要使用合适的算法确定
    停止等待协议
    这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat reQuest)
    如果接收端接收到重复的M1则使用重传的M1
    如果发送端已经接受到接收端的确认M1,即使后面再次接收到确认M1也不管
    计算机网络 - 图6
    连续 ARQ 协议
    ARQ协议的缺点是信道利用率太低,连续ARQ协议中发送端可以连续发送分组,不必每发送一个就等待确认
    下图窗口内的所有数据都一个连续发送出去,并且会根据收到的确认信号滑动窗口
    如果发送端接收到分组3的确认信号则发送窗口左边可以划到分组4,不需要接收分组1,2的确认信号
    * 如果分组3丢失了,分组4,5成功接收了,发送端仍然需要重传分组3,4,5
    计算机网络 - 图7

    4.3.6 可靠通信的具体实现

    计算机网络 - 图8
    计算机网络 - 图9
    计算机网络 - 图10
    计算机网络 - 图11

    4.3.7 超时重传时间的选择

    1. * TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段<br /> * 一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT,加权平均往返时间 RTTs 计算如下:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357746-f84fde79-9caf-4ada-8121-b2e6f0dfe5bd.png#height=36&id=E0be0&originHeight=36&originWidth=314&originalType=binary&ratio=1&status=done&style=none&width=314) 其中,0 ≤ a < 1,RTTs 随着 a 的增加更容易受到 RTT 的影响

    4.3.8 TCP的流量控制

    1. * **流量控制是为了控制发送方发送速率,保证接收方来得及接收**<br /> * 利用滑动窗口实现流量控制<br /> * **接收方发送的确认报文中窗口字段可以用来控制发送方窗口大小**,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据

    4.3.9 TCP 的拥塞控制

    1. * **流量控制是接收端,拥塞控制是发送端**<br /> * 拥塞控制的作用:<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357797-6eb020c8-1c2c-4036-b61b-01fc0a307429.png#height=228&id=pZPjp&originHeight=228&originWidth=425&originalType=binary&ratio=1&status=done&style=none&width=425)<br /> * **TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复**<br /> * 发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量<br /> * 拥塞窗口与发送方窗口的区别:实际窗口大小=min(拥塞窗口,发送窗口),即实际窗口大小可能小于拥塞窗口<br /> * 为了便于讨论,做如下假设:<br /> * 接收方有足够大的接收缓存,因此不会发生流量控制<br /> * 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段

    4.3.10 拥塞控制——慢开始与拥塞避免

    1. * 拥塞窗口(cwnd)从1开始,没有达到ssthresh前指数增长,达到ssthresh后线性增长<br /> * 一旦发生拥塞,ssthreash设置为拥塞时拥塞窗口大小/2,并且窗口回到1,重新慢开始<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357838-ffc17b4e-4ace-46c2-9955-f8b0e9f9d082.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=315&id=EUXr6&originHeight=315&originWidth=709&originalType=binary&ratio=1&status=done&style=none&width=709)

    4.3.11 拥塞控制——快重传

    1. * **快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认,这样做可以让发送方及早知道有报文段没有到达接收方(对比的是超时重传)**<br /> * 例如已经接收到 M1 M2,此时收到 M4,应当发送M2的确认<br /> * 发送方只要连续收到三个重复确认就应当立即重传对方尚未收到的报文段,例如收到M1,M2,然后收到M4,M5,M6<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357879-0666e2dc-1cda-412b-98a0-0c6f800c2741.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=411&id=dlwtI&originHeight=411&originWidth=670&originalType=binary&ratio=1&status=done&style=none&width=670)

    4.3.12 拥塞控制——快恢复

    1. * **执行时机:**当发送端收到连续**三个重复的确认**时(**快重传**)<br /> * **执行操作:**执行“乘法减小”算法,把慢开始门限 ssthresh 减半,并且拥塞窗口不设置为1而是从减半后的ssthresh开始线性增加<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357923-a6662776-6a34-4f07-9297-0ae0d0b252f2.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=303&id=T2FOQ&originHeight=303&originWidth=695&originalType=binary&ratio=1&status=done&style=none&width=695)

    4.3.13 TCP 的运输连接管理

    1. * 运输连接就有三个阶段,即:**连接建立**、**数据传送**和**连接释放**<br /> * 连接建立过程中要解决以下三个问题:<br /> * 要使每一方能够确知对方的存在。<br /> * 要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。<br /> * 能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。<br /> * **TCP连接建立的三次握手**<br />** **假设 A 为客户端,B 为服务器端。<br /> (1) 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求,处于LISTEN状态<br /> (2) A B 发送连接请求报文,SYN=1ACK=0A随机选择初始的序号 x,然后客户端处于SYN-SENT状态<br /> (3) B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1ACK=1,确认号为 x+1,同时随机选择初始的序号 y,然后服务端处于SYN-RCVD状态<br /> (4) A 收到 B 的连接确认报文后,向 B 发出确认,确认号为 y+1,序号为 x+1,然后客户端处于ESTABLISHED状态(没有SYN=1)<br /> (5) B 收到 A 的确认后,连接建立<br /> (6+) 三次握手的时候可能还会交换窗口大小和缓存大小<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510357957-ef15ff88-14b8-44fd-8792-5ecec5803697.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=421&id=Ob10d&originHeight=421&originWidth=679&originalType=binary&ratio=1&status=done&style=none&width=679)<br /> * **三次握手的原因**<br /> * 第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接<br /> * 客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接<br /> * 三次握手后,可以保证两端发送正常和接收正常<br /> * **TCP 的连接释放的四次挥手**<br /> (1) A发送连接释放请求FIN=1,seq=u(并不重要)<br /> (2) B收到后发送确定信号,ACK=1,seq=v,ack=u+1,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。<br /> (3) 当 B 不再需要连接时,发送连接释放报文,FIN=1<br /> (4) A 收到后发出确认,进入 TIME-WAIT 状态,等待 2*MSL(最大报文存活时间)后释放连接(客户端**主动关闭连接的,才有 TIME_WAIT 状态**)<br /> (5) B 收到 A 的确认后释放连接<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510358006-e0aa6605-811e-4654-a8be-2d2818f56736.png#height=43&id=CajaJ&originHeight=43&originWidth=553&originalType=binary&ratio=1&status=done&style=none&width=553)<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510358055-e5844377-80c9-45de-8e04-75f23f6e0840.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=481&id=GteHr&originHeight=481&originWidth=676&originalType=binary&ratio=1&status=done&style=none&width=676)<br /> * **四次挥手的原因**<br /> *** 客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文**<br />** * TIME-WAIT状态等待2*MSL原因:**<br />** * 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生**<br /> * **等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文**

    4.3.14 TCP 的有限状态机

    1. 粗实线箭头表示对客户进程的正常变迁。<br /> 粗虚线箭头表示对服务器进程的正常变迁。<br /> 细线箭头表示异常变迁<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510358093-f57b879e-bb3b-4a3d-a848-c4805195e36c.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=535&id=bs6Wo&originHeight=535&originWidth=648&originalType=binary&ratio=1&status=done&style=none&width=648)

    4.4 TCP面试题

    三次握手时可以携带数据吗?

  • 第三次握手是可以携带数据的,前两次握手是不可以携带数据的

    • RFC793文档里带有SYN标志的过程包是不可以携带数据的,也就是说三次握手的前两次是不可以携带数据的
    • 第一次握手如果可以携带数据:可能会有人每次都在第一次握手中的SYN报文中放入大量数据。而且频繁重复发SYN报文
    • 第三次握手时客户端知道服务端可以正常处理请求,所以可以携带数据了(此时服务端不知道自己的请求是否可以到达客户端)

      为什么是三次握手?不是两次、四次?

  • 三次握手才可以防止历史连接的初始化,防止建立无用连接导致资源浪费(主要原因)

    • 三次握手的首要原因是为了防止旧的重复连接初始化造成混乱
    • 客户端连续发送多次 SYN 建立连接的报文,在网络拥堵等情况下:
      • 一个「旧 SVN 报文」比「最新的 SYN 」 报文早到达了服务端
      • 那么此时服务端就会回一个 SYN + ACK 报文给客户端
      • 客户端收到后可以根据自身的上下文,判断这是一个历史连接(序列号过期或超时),那么客户端就会发送 RST 报文给服务端,表示中止这一次连接
    • 如果是两次握手连接,就不能判断当前连接是否是历史连接,三次握手则可以在客户端(发送方)准备发送第三次报文时,客户端因有足够的上下文来判断当前连接是否是历史连接
    • image.png
  • 三次握手才可以同步双方的初始序列号

    • TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素,它的作用:
      • 接收方可以去除重复的数据
      • 接收方可以根据数据包的序列号按序接收
      • 可以标识发送出去的数据包中, 哪些是已经被对方收到的
    • 四次握手其实也能够可靠的同步双方的初始化序号,但由于第二步和第三步可以优化成一步,所以就成了「三次握手」
    • 两次握手只保证了一方的初始序列号能被对方成功接收,没办法保证双方的初始序列号都能被确认接收
    • image.png

      既然 IP 层会分片,为什么 TCP 层还需要 MSS 呢?

  • 两种分割方式:

    • MTU:一个网络包的最大长度,以太网中一般为1500字节
    • MSS:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度
  • 如果在 TCP 的整个报文(头部 + 数据)交给 IP 层进行分片,效率可能会很差?
    • IP层会将超过一个MTU大小的数据进行分片
    • IP数据包被分片发送后,由目标主机的IP层重新组装,再交给上一层TCP传输层
    • 正常是没问题的,但是如果一个IP分片丢失,整个IP报文的所有分片都得重传
    • 而且IP层没有超时重传机制,对于接收方来说,当发现TCP报文某分片丢失时,不会响应ACK给发送方,发送方在TCP超时后再重发「整个 TCP 报文(头部 + 数据)」
    • 所以发生分片丢失时,效率低下
  • 所以在建立TCP连接时通常要协商双方的MSS值

    • TCP层发送数据时,发现数据超过MSS,就会在TCP层对其分片,这样IP层就不会大于MTU,自然不用IP层进行分片了
    • 如果TCP分片丢失后,进行重发时也是以MSS为单位的,不用重传所有分片,大大增加了重传效率

      为什么挥手需要四次?

  • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据

  • 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接,所以服务端的 ACKFIN 一般都会分开发送,从而比三次握手导致多了一次

    为什么需要 TIME_WAIT 状态,且超过2MSL?

  • 主动发起关闭连接的一方,才会有 TIME-WAIT 状态

  • TIME-WAIT 作用:等待足够的时间以确保最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭
  • 原因:

      1. 防止关闭后又建立的新连接接收到旧连接的数据包
        • 假设TIME_WAIT等待过短,那么被复用的端口可能会建立新的TCP连接
        • 此时旧的连接在四次握手前可能有一个旧的数据包刚刚到达(图中SEQ=301)
        • 这样新的连接就会处理旧的服务端数据包,产生数据错乱等严重问题
        • 经过 2MSL 这个时间,足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的
        • image.png
    • 2.等待足够的时间以确保最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭
      • 如果服务端发送了FIN后,没有接收到客户端的ACK报文,则会超时重传再次发送FIN
      • 所以需要客户端等待2MSL,确保服务端接收到了ACK报文

        如果已经建立了连接,但是客户端突然出现故障了怎么办?

  • TCP 有一个机制是保活机制

    • 在定义的时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用
    • 每隔一个时间间隔,发送一个探测报文,该探测报文包含的数据非常少
    • 如果连续几个探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序

      5.应用层

      5.1 域名系统 DNS (Domain Name System)

      • DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据
        因特网的域名结构
        域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名
        计算机网络 - 图15

        5.2 文件传送协议 FTP (File Transfer Protocol)

      • FTP 屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传送文件
        一个 FTP 服务器进程可同时为多个客户进程提供服务。FTP 的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求
        FTP 的基本工作原理
        FTP 使用 TCP 进行连接,它需要两个连接来传送一个文件
        控制连接:服务器打开端口 21 等待客户端的连接,客户端主动建立连接后,使用这个连接将客户端的命令传送给服务器,并传回服务器应答
        数据连接:用来传送一个文件数据。
        根据数据连接是否是服务器端主动建立,FTP 有主动被动两种模式
        主动模式(PORT):服务器端主动建立数据连接,其中服务器端的端口号为 20,客户端端口号随机,但是必须大于1024,即,服务器端20端口
        主动连接客户端指定的随机端口
        被动模式(PASV):客户端主动建立数据连接,其中客户端的端口号由客户端自己指定,服务器端随机选择大于1024的端口号。
        * 主动模式要求客户端开放端口号给服务器端,需要去配置客户端的防火墙。被动模式只需要服务器端开放端口号即可,无需客户端配置防火墙。但是被动模式会导致服务器端的安全性减弱,因为开放了过多的端口号。

        5.3 超文本传送协议 HTTP

  • HTTP 1.0 协议是无状态的(stateless)

    • 协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
    • 可以使用Cookie解决无状态问题
  • HTTP 1.0 协议是无连接
    • HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接
    • 比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量
    • HTTP 1.1 持久连接(HTTP keep-alive)可以解决无连接问题,只要任意一端没有明确提出断开连接,则保持TCP连接状态,在请求首部字段中的Connection: keep-alive即为表明使用了持久连接 | 版本 | 产生时间 | 内容 | 发展现状 | | —- | —- | —- | —- | | HTTP/0.9 | 1991年 | 不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求 | 没有作为正式的标准 | | HTTP/1.0 | 1996年 | 传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令 | 正式作为标准 | | HTTP/1.1 | 1997年 | 持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码 | 2015年前使用最广泛 | | HTTP/2 | 2015年 | 多路复用、服务器推送、头信息压缩、二进制协议等 | 逐渐覆盖市场 |

5.4 HTTP 有两类报文:

  1. * **请求报文**——从客户向服务器发送请求报文。<br /> * **响应报文**——从服务器到客户的回答。<br /> * **请求报文结构:**<br />** ** * 方法:GET,POST,OPTION,PUT,DELETE<br /> * URL:请求资源的URL<br /> * 版本:HTTP的版本<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510358195-593c6911-3204-4bc3-8816-64ffe84cd66a.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=381&id=CgZkT&originHeight=381&originWidth=702&originalType=binary&ratio=1&status=done&style=none&width=702)<br /> * **响应报文结构:**<br /> * 版本:HTTP的版本<br /> * 状态码:<br /> * 1xx:表示请求收到了或正在进行处理<br /> * 2xx:成功<br /> * 3xx:重定向 <br /> * 4xx:请求中有语法错误<br /> * 5xx:服务器出错<br /> ![](https://cdn.nlark.com/yuque/0/2020/png/1266758/1586510358232-3c120c8c-9726-4af5-93de-c16a18cca955.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_10%2Ctext_THVrYQ%3D%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=411&id=F7m6H&originHeight=411&originWidth=646&originalType=binary&ratio=1&status=done&style=none&width=646)

5.5 HTTP/1.1 协议

  • HTTP1.1最大的特点:使用持久化连接
    • 服务器在发送响应后仍保持连接一段时间,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的 HTTP 请求报文和响应报文
  • HTTP 1.1提出了管线化(pipelining)理论,客户端可以同时发出多个HTTP请求,而不用一个个等待响应后再请求

    • 但是大部门浏览器都默认关闭该特性,所以使用HTTP 1.1协议的应用,都有可能开多个TCP连接

      5.6 HTTP/2.0 协议

  • HTTP 2.0最重要的特性:支持多路复用(Multiplexing)

    • 实现了管线化,可以不等待响应,直接发送下一个请求
    • image.png
  • HTTP 2.0性能增强核心在于:二进制分帧层
    • HTTP 2.0 在应用层和传输层(TCP or UDP)之间增加一个二进制分帧层
    • 在二进制分帧层中, HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码
    • HTTP1.x 的首部信息会被封装到 HEADER frame,而相应的 Request Body 则封装到 DATA frame里面
    • HTTP/2 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流
    • 过去由于慢启动+不同资源使用不同连接,导致性能优化的关键在于低延迟而不是高带宽
    • HTTP 2.0让所有数据流共用同一个连接,可以有效地使用TCP连接,让高带宽也服务于HTTP的性能提升
  • HTTP 2.0 二进制帧和HTTP 1.X格式对比
    • length定义了整个frame的开始到结束
    • type定义frame的类型(一共10种)
    • flags用bit位定义一些重要的参数
    • stream id用作流控制
    • payload就是request的正文
    • image.png
  • HTTP 2.0 二进制帧和HTTP1.X语义的关系
    • HTTP 2.0没有改变HTTP1.X的语义,只是把原来http1.x的header和body部分用frame重新封装了一层而已
    • image.png

      5.7 浏览器输入URL发生了什么

  1. 浏览器分析URL是否合法
  2. 游览器检查是否有缓存(游览器缓存-系统缓存-路由器缓存),如果有,直接显示。如果没有,跳到第三步
  3. 浏览器向 DNS 请求解析 www.tsinghua.edu.cn 的 IP 地址
  4. 域名系统 DNS 解析出清华大学服务器的 IP 地址
  5. 浏览器向服务器发起tcp链接,与浏览器经历tcp三次握手
  6. 握手成功后,游览器向服务器发送http请求,请求数据包,浏览器发出取文件命令:GET /yhn/index.html
  7. 服务器给出响应,把文件 index.html 发给浏览器
  8. 浏览器收到http响应
  9. TCP 连接释放
  10. 浏览器显示“清华大学院系设置”文件 index.htm 中的所有文本

    5.8 数字签名

  • 数字签名是一种用于验证消息的真实性和完整性的技术,验证内容是否被篡改,确定内容是谁生成的
  • 数字签名步骤:
    • 使用哈希算法(MD5,SHA-1)创建原文本的摘要(digest)
    • 使用发送者的私钥对摘要进行加密
    • 将加密后的摘要附加到原消息后,发送给接收者
    • 接收者在原消息上也以同样的方法创建第二个摘要,如果两个摘要相同则认为消息没有被篡改
  • 生成签名
    • image.png
  • 验证签名
    • image.png
  • 细节:对摘要进行加密使用的是发送方的私钥,而私钥是自己才有的,这就是唯一性的证明
  • 数字签名是常规的非对称加密的逆应用,在数字签名中,使用私钥加密,使用公钥解密
  • 数字签名的特点是只有自己才可以签名(使用私钥),但是大家都可以验证签名

    5.9 数字证书

  • 为了保证公钥的安全传输,不被中间人攻击,使用数字证书

  • 服务器申请数字证书步骤:
    • 服务器向权威机构(Certificate Authority,简称 CA)申请一个证书
    • CA把服务器的公钥、服务器信息、CA自己的信息等作为原始数据
    • CA用哈希算法对原始数据计算哈希值,用CA自己的私钥加密原始数据,得到数字签名
    • CA把数字签名附加在原始数据后,得到数字证书
  • 客户端验证证书:

    • 客户端接收到服务器的数字证书
    • 客户端有该CA的公钥(公钥内置在浏览器或者操作系统中,默认相信公钥没有被中间人攻击到)解密数字证书中的数字签名,得到原始哈希值
    • 客户端用哈希算法对数字证书的原始数据计算哈希值
    • 如果哈希值相同,说明数字证书没有修改,这样就可以得到服务器的公钥

      5.10 HTTPS工作原理

  • HTTPS是身披SSL外壳的HTTP

  • 一般在建立安全连接时使用非对称加密(RSA),建立完成后使用对称加密(因为非对称加密计算量大)(不能使用对称加密建立安全连接)

    5.10.1 HTTPS工作步骤

  1. client向server发送请求https://baidu.com,然后连接到server的443端口,发送的信息主要是随机值1和客户端支持哪些加密算法。
  2. server接收到信息之后给予client响应握手信息,包括随机值2和匹配好的协商加密算法,这个加密算法一定是client发送给server加密算法的子集。
  3. 随即server给client发送第二个响应报文是数字证书(数字证书主要包含的是服务器的公钥)
  4. 客户端使用内置的CA公钥解析证书,这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果证书没有问题,那么就生成一个随机值(预主密钥)
  5. 客户端认证证书通过之后,接下来是通过随机值1、随机值2和预主密钥组装会话密钥。然后通过证书的公钥加密会话密钥。
  6. 传送加密信息,这部分传送的是用证书加密后的会话秘钥,目的就是让服务端使用密钥解密得到随机值1、随机值2和预主密钥。
  7. 服务端解密得到随机值1、随机值2和预主密钥,然后组装会话密钥,跟客户端会话密钥相同(可以开始对称加密了)
  8. 客户端通过会话密钥加密一条消息发送给服务端,主要验证服务端是否正常接受客户端加密的消息。
  9. 同样服务端也会通过会话密钥加密一条消息回传给客户端,如果客户端能够正常接受的话表明SSL层连接建立完成了。

image.png

5.11 HTTP面试题

HTTP不同请求类型的区别

  • GET请求
    • 从服务器取回数据。只是取回数据,一般不会产生其他影响
    • 一般来说GET请求是幂等的
  • POST请求
    • 创建一个实体,通常用POST请求来上传文件或者表单
    • 一般来说不是幂等的,可能会修改服务器上的资源
    • GET产生一个TCP数据包,POST产生两个TCP数据包
    • 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
    • 对于POST请求,浏览器先发送header,服务器响应100 continue浏览器再发送data,服务器响应200(返回数据)
  • PUT请求
    • 用来更新一个已有的实体。通过把已经存在的资源的ID和新的实体用PUT请求上传到服务器来更新资源
    • 一般来说是幂等的,但是更新资源可能是取消订单这种操作,这种就不是幂等的,这是REST API的挑战
  • DELETE请求
    • 从服务器上删除资源。需要把要删除的资源的ID上传给服务器
  • TRACE请求
    • 提供一种方法来测试当一个请求发生的时候,服务器通过网络收到的内容。所以它会返回你发送的内容
  • HEAD请求
    • HEAD请求和GET请求资源类似,但仅仅返回相应的头部,没有具体的响应体。它也不会对服务器造成其他影响
  • OPTIONS请求
    • OPTIONS允许客户端请求一个服务所支持的请求方法
    • 它所对应的响应头是Allow,它非常简洁地列出了支持的方法
    • 服务端成功处理了OPTIONS请求后,响应的内容:Allow: HEAD,GET,PUT,DELETE,OPTIONS
  • CONNECT请求

    • 主要用来建立一个对资源的网络连接。一旦建立连接后,会响应一个200状态码和一条”Connectioin Established”的消息

      常见的HTTP状态码

  • 更全面的HTTP状态码

  • 200(“OK”):请求被正常处理
  • 204(“No Content”):请求被受理但没有资源可以返回(例如PUT、POST、DELETE请求)
  • 301(“Moved Permanently”):永久性重定向
  • 302(“Moved Temporarily”):临时重定向
  • 400(“Bad Request”):请求报文语法有误,服务器无法识别
  • 401(“Unauthorized”):请求需要认证
  • 403(“Forbidden”):请求的对应资源禁止被访问
  • 404(“Not Found”):服务器无法找到对应资源
  • 500(“Internal Server Error”):服务器内部错误,执行请求处理代码遇到异常时发送此响应代码
  • 503(“Service Unavailable”):服务器正忙

    Cookie和Session区别

  • Cookie

    • Cookies分为会话Cookie和持久Cookie
      • 会话Cookie:不设置Cookie过期时间,浏览器开启到关闭就是一次会话,关闭浏览器一次会话结束,会话Cookie随之销毁
      • 持久Cookie:关闭浏览器不会销毁,过期时间到了才会销毁
  • Session原理:
    • Cookie是实现Session的一种方式
    • Session机制采用的是一种在服务器端保持状态的解决方案,针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器
    • 浏览器第一次访问服务器时会创建一个session对象并返回一个JSESSIONID=ID的值,创建一个Cookie对象key为JSSIONID,value为ID的值,将这个Cookie写入浏览器
    • 浏览器在第二次访问服务器的时候携带Cookie信息JSESSIONID=ID的值,如果该JSESSIONID的session已经销毁,那么会重新创建一个新的session再返回一个新的JSESSIONID通过Cookie返回到浏览器
  • 区别:
    • Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端
    • Cookie有大小限制4K以及浏览器在存cookie的个数也有限制,Session是没有大小限制
    • Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击
    • Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力

      HTTP与HTTPS的区别

  1. HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头
  2. HTTP 是不安全的,而 HTTPS 是安全的
  3. HTTP 标准端口是80 ,而 HTTPS 的标准端口是443
  4. 在OSI 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层
  5. HTTP 无法加密,而HTTPS 对传输的数据进行加密
  6. HTTP无需证书,而HTTPS 需要CA机构wosign的颁发的SSL证书

计算机网络面试题总结.pdf