暑假期间,我读了这本书,为即将到来的专业课程奠定了一点基础。总结一下大致的内容,然后在课后补充你所学到的东西。 我觉得这本书有很多例子,很容易理解。这是一本很容易读的入门书。
本学期结合教师和教科书的内容,补充笔记。王卫亚老师讲课很清楚,课后对一些不懂的地方了解透彻。
文章目录
- 基础
-
- 通信链路和分组交换机
- 家庭接入网
- 分组交换网络的延迟、丢包和吞吐量
-
- 时延
- 排队时延和丢包
- 吞吐量
- 协议栈
- 安全
- 可靠的数据传输原理
-
- 比特差错怎么办?
- 丢包怎么办
- 流水线技术
-
- 回退N步(GBN)协议
- 选择重传(SR)协议
- 应用层
-
- 应用层协议
- Web
-
- HTTP
-
- HTTP请求报文
- HTTP响应报文
- cookie
- Web缓存器
- FTP协议
- 电子邮件
- DNS
- 运输层
-
- UDP
-
- 校验和
- TCP
-
- 3次握手
- 4次挥手
- 流量控制
- 拥塞控制
- 网络层
-
- 数据平面
-
- IP协议
- IPv4
- IPv6
- ARP协议
- 子网划分
- CIDR
- 路由器
- NAT
- DHCP协议
- 控制平面
-
- ICMP协议
- RIP协议
- OSPF协议
- BGP协议
- 链路层
-
- 检测和纠正错误
-
- 奇偶校验
- 循环冗余校验
- PPP协议
-
- PPP帧
- 局域网
-
- 多路访问协议
- CSMA/CD协议
- MAC帧
- 交换机
基础
通信链路和分组交换机
和连接端系统。 通信链路包括不同传输速率的同轴电缆、铜线、光纤和无线电谱。 当一个端系统将数据发送到另一个端系统时,发送端系统将数据分段,并在每个段添加第一个字节。由此形成的信息包称为。 分组交换机从其一个进入通信链路接收到达的分组,并从其一个出口通信链路转发。分组交换机包括
一种理解:分组类似于卡车,通信链接类似于高速公路和公路,分组交换机类似于交叉口,端系统类似于建筑。
从发送端系统到接收端系统,一系列通信链路和分组交换机被称为通过该网络
家庭接入网
宽带住宅接入有两种最流行的方式:
- DSL 从提供本地电话接入的本地电话公司获取DSL因特网接入。家庭电话线还携带数据和传统电话信号,编码频率不同:分为高速下行信道、中速上行信道和普通双向电话信道。
- 电缆 住宅从提供有线电视的公司获得了电缆因特网接入。电缆因特网接入需要电缆调制解调器,将网络分为上下两个通道。电缆因特网接入的一个重要特点是共享广播媒体。因此,如果几个用户同时通过下行通道下载视频文件,每个用户接收视频文件的实际速率将远低于电缆的总下行速率。
- 光纤到户
光纤到户(Fiber To The Home,FTTH) 它提供了一个更高的速度,它直接从当地的中心局到家庭提供了一条光纤路径。从中央局提供的每一种光纤都由许多家庭共享,直到它相对接近这些家庭。有两种光纤分布系统结构:有源光纤网络(Active Optical Network,AON) 和无源光纤网络(Passive Optical Network,PON) 。
PON:每个家庭都有一个光纤网络端接器 (Optical Network Terminator, ONT),它通过特殊的光纤连接到相邻的光纤分配器 (splitter) 。该分配器将一些家庭集成到共享光纤中,然后连接到当地电话号码和公司中心局光纤线路端接器 (Optical Line Terminator, OLT)。该OLT提供了光信号和电信号之间的转换,经过本地电话公司路由器与因特网相连。在家庭中,用户将一台家庭路由器(通常是无线路由器)与ONT通过这个家庭路由器连接到因特网。
- 以太网 局域网也可以使用(LAN)将端系统连接到边缘路由器。以太网是最流行的局域网技术,用户使用双绞铜线连接到以太网交换机,以太网交换机或这样的交换机网络连接到更大的因特网。
网络链路和交换机移动数据有两种基本方法:
- 分组交换 大多数分组交换机在链路的输入端使用
存储、转发和传输(store-and-forward transmission) 机制。存储、转发和传输是指在交换机开始将分组的第一个比特传输到输出链路之前,必须接收整个分组的所有比特并缓存,然后才能开始向出链路传输。 每个分组交换机都有多个链路连接。路由器以这种方式确定向哪个链路传输:通过转发表(forwarding table) 将分组首部的IP地址映射为输出链路。对于每个链路,分组交换机都有一个输出缓存(或输出队列)。当网络堵塞时,一个到达的分组可能会发现缓存已经满了,然后就会发生分组丢失(丢包)(packet loss) ,也就是说,已经到达或排队的分组之一将被抛弃。 - 电路交换 每台主机都与一台交换机直接相连。 当两个主机主要通信时,电路交换网络在两个主机之间创建一个特殊的
端到端连接(end-to-end connection) ,称作电路 ,电路是通过频分复用(Frequency-Division Multiplexing, FM ) 或时分复用(Time-Division Multiplexing, TDM) 来实现的。 对于FDM,链路的频谱由跨越链路创建的所有连接共享。在连接期间链路为每条连接专用一个频段,该频段的宽度称为带宽(bandwidth) 。 对于TDM链路,时间被划分为固定期间的帧,并且每个帧又被划分为固定数量的时隙。当网络跨越一条链路创建一条连接时,网络在每个帧中为该连接指定一个时隙。 这些时隙专门由该连接单独使用,一个时隙(在每个帧内)可用于传输该连接的数据。
简单来说,分组交换和电路交换的区别就是:前者是按需分配,而后者是按人头分配。例如对于TMD,用户不可以使用为其他用户所分配的时隙。
分组交换网的时延、丢包和吞吐量
时延
分组在沿途的每个节点会经受几种不同类型的时延。最为重要的是
- 处理时延 检查分组首部和决定将该分组导向何处所需要的时间是处理时延的一部分,处理之后,路由器将该分组引向通往下一个路由器链路之前的缓存队列。高速路由器的处理时延通常是微秒或更低的数量级。
- 排队时延。
- 传输时延 这是将所有分组的比特推向链路所需要的时间,即分组比特长度/传输速率(单位是Mbps)。实际的传输时延通常在毫秒到微秒量级。
- 传播时延 分组被推向链路之后,从该链路的起点到下一个路由器的时间是传播时延,传播速率取决于该链路的物理媒体,速率范围是2xl08~3xl08m/s。
对于传输时延和传播时延的区别,前者是路由器推出分组所需要的时间,而后者是一个比特从一台路由器传播到另一台路由器所需要的时间。 下面是3个节点之间的一个传播过程。演示传播-传输-传播的过程。注意要等整个分组到达第二个节点并完成缓存之后才开始传输分组。
做一个类比:假设高速公路收费站间的公路段是链路,收费站是路由器。有10辆汽车(每辆汽车是一个比特)作为一个车队(一个分组)在行驶。首先要先确认每辆车都到达了该收费站(这个时间是排队时延),然后假定每个收费站以每辆车10s的速度(即传输速率)服务一辆汽车,这个车队必须在服务时间100s(传输时延)后才可以出发。 注意如果车速很快或两个收费站之间的路程很短,而服务时间很长的话,可能在最后几辆车离开之前,前面几辆车就已经到达了下一个收费站。(动画演示)
排队时延和丢包
节点时延中最复杂的是排队时延。 令a表示分组到达队列的平均速率,以分组/秒(即packet/s)为单位。R表示传输速率,以bps(即b/s)为单位。假定所有分组都是由L比特组成的,则比特到达队列的平均速率是L*a(bps),比率La/R被称为
如果La/R>1,就会出现丢包的情况(动画演示)。而如果La/R≤1,则可能出现排队时延。
吞吐量
协议栈
网络以
- 应用层 应用层是网络应用程序及它们的应用层协议存留的地方。因特网的应用层包括许多协议,例如HTTP、SMTP、FTP等。把位于应用层的分组称为
报文(message) 。 - 运输层 运输层在应用程序端点之间传送应用层报文。因特网中有两种运输协议:TCP和UDP。把运输层的分组称为
报文段(segment) 。 - 网络层 网络层包括IP协议,通常把它称为IP层。网络层的分组称为
数据报(datagram) ,网络层负责将数据报从一台主机移动到另一台主机。 - 链路层 链路层将数据报沿路径传向下一个节点并上传给网络层。链路层的例子包括以太网、WiFi和电缆接入网的DOCSIS协议。把链路层分组称为
帧(frame) 。 - 物理层 物理层将帧中的一个个比特从一个节点移动到下一个节点。
安全
-
将有害程序放入电脑:
病毒(virus) 是一种需要某种形式的用户交互来感染用户设备的恶意软件。典型的例子是包含恶意可执行代码的邮件附件。蠕虫(worm) 是一种无须任何明显用户交互就能进入设备的恶意软件。
-
另一种安全性威胁称为
拒绝服务攻击(Denial-of-Service attack,DoS) ,攻击服务器和基础设施使得不能由合法用户使用。大多数DoS攻击属于下列三种类型之一:- 弱点攻击:向一台目标主机上运行的易受攻击的应用程序或操作系统发送制作精细的报文,导致服务器停止运行或主机崩溃。
- 带宽洪泛:向目标主机发送大量的分组使得目标的接入链路变得拥塞,导致合法的分组无法到达服务器。
- 连接洪泛:在目标主机中创建大量的半开或全开TCP连接,导致主机停止接受合法的连接。
-
分组嗅探机 在无线传输设备的附近放置一台接收机,该接收机就能得到传输的每个分组的副本。这样的接收机被称为
分组嗅探器(packet sniffer) 。由于分组嗅探机只是被动地接受信息而不注入,因此难以检测。最好的防御方法都与密码学有关。 -
IP哄骗 生成具有任意源地址、分组内容和目的地址的分组,然后将这个人工制作的分组传输到因特网中,就可以让接收方执行某些嵌入在该分组内容中的命令。将具有虚假源地址的分组注入因特网的能力被称为
IP哄骗(IP spoofing) 。为了解决这个问题,我们需要采用端点鉴别 ,即一种使我们能够确信一个报文源自我们认为它应当来自的地方的机制。
可靠数据传输原理
出现比特差错怎么办
丢包怎么办
发送方需要一个定时器,选择一个最大时间,如果超过这个时间还没有收到ACK就重传数据。对于因此而导致的可能出现的冗余数据分组,也可以通过上面序号的方式解决。 对于简单的情况,1比特的序号就足够了。与上一个数据相同则表示重传,否则就是新的数据。由于分组序号在0和1之间交替,因此这样的协议被称为
流水线技术
上面的协议主要性能缺陷来源于停等协议。因此解决方法就是不以停等的方式运行,允许发送方发送多个分组,这被称为
回退N步(GBN)协议
即使可以同时发送多个分组,但最大数量仍受限制。 假设序号字段的比特为k位。那么序号空间就可以看做是一个长度为2k的环。那些已发送但还未被确认的分组的序号范围可以被看成是一个在序号范围内长度为N的窗口,因此N被称为
通过这个动画可以直观地看到GBN的过程
GBN发送方在发送分组时,首先检查窗口是否已满,即是否有N个已发送但未确认的分组。如果满了则缓存数据或使用同步机制。发送后如果出现超时,就重传所有已发送但未确认分组,这就是回退N步的意思。 接收方丢弃所有失序分组。比如此时期望收到n分组,但却先收到了n+1分组。接收方就将该分组缓存,如果n分组丢失,那么它将丢弃该n+1分组。这就是
也因此,BGN可能会因为一个分组的差错而引起大量分组的重传。这会大大降低性能。
注意
选择重传(SR)协议
SR协议通过发送方仅重传出错的分组来解决这个性能问题。
SR接收方不管这个分组是否是按顺序的都会接收它,失序的分组会被缓存直到所有序号小于它的分组都被接收。每个收到的分组都有两个边界,表示其字节序号的范围,采用左闭右开的表示方法。
SR动画
应用层
应用程序体系结构规定了如何在各种端系统上组织该应用程序。包括
可以从四个方面对应用程序服务要求进行分类,来选择合适的运输层:可靠数据传输、吞吐量、定时和安全性。
应用层协议
在运行在多个端系统上的应用程序间进行通信的实际上是
进程通过一个称为
应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文。包括:
- 交换的报文类型:例如请求报文和响应报文。
- 各种报文类型的语法:如报文中的各个字段及这些字段是如何描述的。
- 字段的语义:即这些字段中的信息的含义。
- 确定一个进程何时以及如何发送报文:对报文进行响应的规则。
Web
Web是
URL的一般格式是协议://主机:端口/路径
。
Web的应用层协议是
以前一直不知道超文本是超在哪了,其实所谓超文本就是指包含指向其他文档的链接的文本。
HTTP
HTTP定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户传送Web页面的方式。HTTP使用TCP作为它的支撑运输协议。HTTP客户首先发起一个与服务器的TCP连接。一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问TCP。客户向它的套接字接口发送HTTP请求报文并从它的套接字接口接收HTTP响应报文。类似地,服务器从它的套接字接口接收HTTP请求报文和向它的套接字接口发送HTTP响应报文。 因为HTTP服务器并不保存关于客户的任何信息,所以说HTTP是一个
书上说无状态的特性使得服务器更容易支持大量并发请求,这个我还没搞懂是为什么。
应用程序可以将每个请求/响应对通过一个单独的TCP连接发送,这种方法被称为
HTTP请求报文
以下面这个请求报文为例:
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: zh-CN
HTTP请求报文的第一行叫作
请求行有3个字段:方法、URL和HTTP版本。方法字段可以取几种不同的值,常见的方法有以下几个:
方法 | 含义 |
---|---|
OPTION | 请求一些选项的信息 |
GET | 请求由URL标志的信息 |
HEAD | 请求由URL标志的信息的首部 |
POST | 给服务器添加信息 |
PUT | 在指明的URL下存储文档 |
DELETE | 删除所指明的URL的资源 |
TRACE | 进行环回测试 |
CONNECT | 用于代理服务器 |
首部行Host: www.someschool.edu
指明了对象所在的主机;Connection: close
指明使用非持续连接的方法;User-agent:
用来指明用户代理,即向服务器发送请求的浏览器的类型。如本例的Mozilla/5.0即Firefox浏览器;Accept-language:
表示想要的该对象的语言版本,如本例的zh-CN表示简体中文。
首部行的最后其实还有一个
HTTP响应报文
以下面这个响应报文为例,它响应上面的请求报文:
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2021 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2021 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...)
响应报文包括三部分:
状态行是第一行,有3个字段:协议版本、状态码和相应状态信息。其中一些常见的状态码和相关的短语包括:
- 200 OK:请求成功,信息在返回的响应报文中。
- 301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL。
- 400 Bad Request: 一个通用差错代码,指示该请求不能被服务器理解。
- 404 Not Found:被请求的文档不在服务器上。
- 505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本。
首部行中Data:
指明发送该响应报文的时间;server:
指明服务器;Last-Modified:
指示了对象创建或者最后修改的日期和时间;Content-Length:
指发送对象的字节字数;Content-Type:
指明实体体中的对象是HTML文本。
实体体包含了所请求的对象本身,即本例中的(data data…)。
cookie
由于HTTP是无状态的,因此需要使用cookie来让站点对用户进行跟踪,使用cookie实现用户和服务器的交互。cookie技术有4个组件:①在HTTP响应报文中的一个cookie首部行;②在HTTP请求报文中的一个cookie首部行;③在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理;④位于Web站点的一个后端数据库。
Web缓存器
可以配置用户的浏览器,使得用户的所有HTTP请求首先指向
至于Web缓存器的作用,Web缓存器首先可以大大减少对客户请求的响应时间。其次可以大大减少一个机构(如公司或大学)的接入链路到因特网的通信量(一般这会比直接提升链路的速率更经济且有效)。
但是仔细想想的话就会发现问题,即存放在缓存器中的对象副本可能是陈旧的。为了解决这个问题,HTTP通过If-Modified-Since:
首部行,其值应该等于上一次请求时得到的响应的Last-Modified:
值。意为只有在指定日期后对象被修改过,才需要发送该对象。如果没有被修改过,服务器则会响应一个状态行为304 Not Modified
的报文。
FTP协议
电子邮件
电子邮件系统有3个主要组成部分:
- 用户代理(user agent) 用户代理允许用户阅读、回复、转发、保存和撰写报文。
- 邮件服务器(mail server)
- 简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)
邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。 电子邮件的报文必须包含From:
和To:
首部行。之后是以ACSII格式表示的报文体。
DNS
一个主机可以由主机名(例如www.google.com)来标识,也可以由IP地址来标识。一个复杂主机名可以有多个
DNS采用了分布式的设计方案,使用了大量的服务器,分布在全世界。有3种类型的DNS服务器:
- 根DNS服务器 有400多个根DNS服务器由13个不同的组织管理。它提供TLD服务器的IP地址。
- 顶级域(Top Level Domain,TLD) DNS服务器 对每个顶级域(如com, org, net等)和国家的顶级域(如cn, fr等),都有TLD服务器。它提供权威DNS服务器的IP地址。
- 权威DNS服务器。 拥有将主机名映射为IP地址的DNS记录。
解析过程是这样的:主机向本地域名服务器查询一般采用递归查询的方式。应用程序调用DNS客户端,指明需要被解析的主机名。用户主机上的DNS接收到后,向网络中发送一个DNS查询报文,然后接收到一个回答报文(所有的DNS请求和回答报文使用UDP数据报经端口53发送)。最后将映射缓存到本地存储器中(一段时间后将会丢弃缓存的信息)。
所有DNS服务器都存储了(Name, Value, Type, TTL)
。TTL指记录的生存时间,即什么时候从缓存中删除。而Name和Value则取决于Type:
- Type = A:Name是主机名,Value是IP地址。
- Type = NS:Name是一个域(如foo.com),Value是一个知道如何获得该域中主机IP地址的权威DNS服务器的主机名。
- Type = CNAME:Value是别名为Name的主机对应的规范主机名。
- Type = MX:Value是别名为Name的邮件服务器的规范主机名。
在命令行输入
nslookup
就可以发送DNS查询。
运输层
网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信。运输层使用16位的
- 熟知端口号 数值为0~1023(0号不用),是规定好的一些端口号。
- 登记端口号 数值为1024~49151,使用这些端口号必须在IANA登记。
- 短暂端口号 数值为49152~65535,在客户进程运行时动态选择。
书中将主机和网络层协议类比为家庭和邮政服务,进程和运输层协议比作两个家庭的所有成员和他们之中负责收发邮件的人。
一个进程有一个或多个套接字。
将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。 从不同套接字中收集数据块,并为其封装上首部信息从而生成报文段,然后将报文段传递到网络层。这个工作称为多路复用。
家庭中负责收发邮件的人将邮件发给各个成员就是多路分解,而将他们写的邮件送给邮政则是多路复用。
UDP
UDP提供不可靠、无连接的服务。应用层交给UDP多长的报文,UDP就照样发送它。
它除了复用、分解功能及少量的差错检测外,几乎没有对IP增加别的东西。在发送报文段之前,发送方和接收方的运输层实体没有握手,因此说UDP是无连接的。
那么为什么不使用更可靠的TCP呢?概括地讲,由于不需要经过握手,且没有拥塞机制,UDP可以保证发送报文段的实时性。并且省去了维护连接状态的开销也使得UDP能支持更多的活跃用户。
UDP的首部包括四个字段:源端口号、目的端口号、长度和校验和。每个字段由2个字节组成。长度字段指明了包括首部在内的UDP报文段长度是多少字节。校验和用于检查报文段是否出现差错。
校验和
发送方的UDP首先增加12个字节的伪首部(既不向上也不向下传递,只用于计算校验和),然后对报文段中的所有16比特字(不足则补0)求和再进行反码运算,求和时如果遇到溢出就要回卷1。将结果放到校验和字段中。 接收方将所有16比特字(包括了校验和)加在一起。如果该分组没有出现差错,那么结果应该是16位1。
TCP
TCP提供可靠的、面向连接的服务。它连接的端点就是套接字。
当一侧要向另一侧发送数据时,它只需经过其套接字将数据丢进TCP连接。这与UDP不同,UDP服务器在将分组丢进套接字之前必须为其附上一个目的地址。 TCP是面向字节流的,它把应用层交下来的数据看成一连串无结构的字节流,将这些来自套接字的字节放到
注意MSS指报文段中应用层数据的长度,而不包括其首部。 MTU指链路层帧的数据部分的最大长度,而非帧的总长。
TCP首部一般有20个字节:
- 各2字节的源端口、目的端口
- 4字节的序号字段、4字节的确认号字段。用于可靠数据传输。 序号是该报文段首字节的字节流编号。例如数据流包含500 000字节,MSS为1000字节,数据流的首字节编号为0。TCP将为该数据流构建500个报文段,第一个序号为0,第二个为1000,以此类推。 确认号是发送方期望从对方那收到的下一字节的序号。因为TCP是全双工的,即A向B发送数据的时候也可能收到来自B的数据。例如A收到了包含字节0 ~ 50以及60 ~ 100的报文段而没有收到51 ~ 59的报文段。那么A到B的下一个报文段中的确认号字段将包含51。因此称TCP提供累计确认。 当接收方收到比期望序号大的报文段时,会发送
冗余ACK (即再次确认已经确认过的某个报文段的ACK)。当接收方收到3个冗余ACK时,TCP就会执行快速重传 (即在该报文段的定时器过期之前重传丢失的报文段)。 - 4位数据偏移 实际上是指首部长度,单位是32位(双字)。
- 6位保留用于以后使用
- 6位的标志字段
URG(urgent) 表示紧急指针字段是否有效。TCP缓存(buffer)优先发送紧急报文段。ACK(acknowledgment) 表示确认字段是否有效。在连接建立后所有报文的ACK都必须置1。PSH(push) 发送方希望在键入一个命令后立即就能收到对方的响应(不然对方可能会因为拥塞、缓存等原因推迟发送),则将PSH置1。TCP缓存(buffer)优先向进程交付PSH位1的报文段。RST(reset) 置1时表示TCP连接出现严重差错,必须释放并重新连接。也可以用来拒绝一个连接。SYN(synchronization) 用于建立连接。FIN(finis) 用于释放连接。
- 2字节的接收窗口字段,用于流量控制。 TCP提供了
流量控制服务(flow control service) 以消除因发送方和接收方速度不匹配而出现的缓存溢岀的可能性。接收窗口 指示自己还有多少可用的缓存空间。接收窗口大小rwnd = 缓存大小 - (到达缓存的最后一个字节的编号 - 从缓存读出的最后一个字节的编号)
- 2字节校验和
- 2字节紧急指针 指出本报文段紧急数据的字节数。注意即使窗口为0也可以发送紧急数据。
- 最多40字节的选项字段。
下面是TCP建立和关闭连接的过程:
3次握手
首先服务器要先创建
- 第一次 首先客户端也创建TCB。然后发送一个不包含应用层数据的特殊报文。将标志字段中的SYN置1,并随机选择一个初始序号
client_isn
放在序号字段中。该报文段会被封装在一个IP数据报中,并发送给服务器。 - 第二次 到达后,服务器为该TCP连接分配TCP缓存和变量,并向该客户TCP发送允许连接的报文段。其中也包括了置为1的SYN、置1的ACK和随机的初始序号
server_isn
,以及确认号client_isn + 1
。该报文被称为SYNACK报文段(SYNACK segment) 。 - 第三次 收到SYNACK报文段后,客户端也给该连接分配缓存和变量,并向服务器发送一个确认报文。其中SYN置为0、ACK置1,确认号为
server_isn + 1
。该报文段可以携带数据,且在不携带数据的时候不消耗序号。
4次挥手
- 第一次 关闭连接时,客户端发出一个特殊的报文段。其中标志字段中的FIN置1,序号
client_isn
为上一个最后的字节序号+1。此时客户端进入FIN_WAIT_1状态 - 第二次 服务器发回一个ACK,确认号为
client_isn + 1
。此时服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。客户端到服务器的连接就被释放了,此时TCP连接处于半关闭(half-close) 状态。即客户端不用发送数据了,但如果服务器发送数据客户端还得接受。 - 第三次 服务器发送自己的终止报文段,即FIN置为1,确认号和上一次相等。此时服务器进入LAST_ACK状态。
- 第四次 客户对服务器的终止报文段发送ACK。此时客户端进入TIME_WAIT状态。必须经过
时间等待计数器(TIME_WAIT timer) 设置的时间2 * MSL
后才进入CLOSED状态,MSL叫做最长报文段寿命(Maximum Segment Lifetime) 。在此期间如果ACK丢失,客户端将重传最后的ACK报文。
流量控制
TCP为每一个连接维护一个
拥塞控制
TCP在出现超时或者收到3个冗余ACK时认为出现了拥塞。TCP在顺利交付报文段后会增加发送速率,但在检测到拥塞时降低速率。 发送方维护一个额外变量LastByteSent - LastByteAcked ≤ min(cwnd, rwnd)
TCP拥塞算法主要包括3部分:慢启动、拥塞避免和快速恢复。前两者是强制实现的,区别在于增加cwnd的方式;后者对发送方不是必需的。
- 慢启动 当TCP建立连接时,cwnd通常初始值设为一个MSS,在每次收到ACK后都增加一个MSS。例如一开始发送一个报文段,收到ACK后发出2个报文段,分别收到ACK后则发出4个报文段。因此慢启动是指数增长的。并且维护并初始化一个变量
ssthresh(slow start thresh,慢启动阈值)
。 慢启动的结束有以下三种情况:① 在检测到拥塞时,TCP令ssthresh = cwmd / 2
,cwmd = 1
,并重新开始慢启动。② 当cwnd增加到ssthresh时,结束慢启动并转移到拥塞避免模式。③ 检测到3个冗余ACK时,令ssthresh = cwmd / 2
,cwmd = ssthresh
,TCP执行并进入快速恢复模式。 - 拥塞避免 此时从每个ACK增加一个MSS变为每个RTT增加一个MSS。例如在一个RTT内发送10个报文段,则每个报文段在确认后增加1/10个MSS。因此拥塞避免是线性增长的。
- 快速恢复 对于快速恢复,必须使用快速重传算法。即接收方不要等待自己发送数据时才进行捎带确认,而是立即发送确认。发送方在连续收到三个冗余ACK时对每个冗余ACK都增加一个MSS。当收到丢失报文段的ACK后,TCP降低cwnd并进入拥塞避免模式。
TCP拥塞控制方式是在每个RTT内线性增加,出现3个冗余ACK时减半,因此也被称为
网络层
网络层要实现两个功能:转发和路由选择。 因此网络层也分为数据平面和控制平面来分别实现这两个功能。 前者是网络层中路由器的功能,决定了到达路由器输入链路的数据报如何转发到该路由器的输出链路。转发的过程只有纳秒级;后者是网络范围的逻辑,控制平面决定数据报所采用的路由或路径。路由选择则通常为几秒。
可以理解为路由选择是出门旅行前做的规划,而转发则是路上从A路口走到B路口。
因特网的网络层提供
要注意TCP/IP协议其实是不严格分层的
例如IP报的数据部分可以包含同是网络层的ICMP协议内容。 又例如一般而言是下层向上层提供服务,但对于TCP/IP协议,却是运输层向网络层提供了可靠保证。
数据平面
IP协议
主机或路由器与物理链路通过
IP地址分两部分:网络号+主机号。网络号为8、16、24位分别对应A、B、C类IP地址。网络号或主机号为0时有特殊含义,例如网络号全0时表示本网络,总结如下表所示:
网络号 | 主机号 | 含义 |
---|---|---|
全0 | 全0 | 本主机 |
全1 | 全1 | 在本网络进行广播(不交给路由器) |
net-id | 全1 | 对net-id网络进行广播 |
127 | 非(全0或全1) | 用于本地软件环回测试 |
IPv4
IPv4数据报关键字段包括:
- 版本号。 4比特,一般是4或6。
- 首部长度 4比特。要注意其单位是32位。例如首部的固定长度部分是20字节,因此首部长度字段的最小值就是5(即5个32位)。
- 区分服务 8比特。用于区分不同服务类型(例如低时延或可靠性)的数据报。一般为0。
- 数据报长度 16比特。表示首部加上数据的长度,其单位为字节。
- 16比特标识、3比特标志、13比特片偏移 与IP分片有关。 由于各个链路层协议所能承载的网络层数据报长度不同,而一个链路层帧能承载的最大数据量就是MTU(例如以太网是1500字节),这要小于数据报的最大长度。因此IPv4将数据报分成很多
片(fragment) 。 每产生一个数据报,标识就+1,路由器在分片时,让一个数据报的所有片都具有相同的标识。 标志字段只有后两位在使用。最低位MF(more fragment)为1时表示后面还有分片。中间位DF(don’t fragment)为1时表示不能分片。 使用偏移字段指定该片应该放在原数据报的哪个位置。其单位为32位,即其值等于该片前面的所有片的字节数除以8。例如将3800字节的数据分为1400、1400、1000三个片。它们的片偏移分别为0、1400/8=175、2800/8=350。 - 寿命(Time-To-Live,TTL) 寿命字段用以确保数据不会永远在网络中循环。每当一台路由器处理数据报时,其TTL减一,当其为0时会被抛弃。
- 协议 该字段当数据报到达最终目的地时才有用,它指示了数据报的数据部分应交给哪个特定的运输层协议。例如,值为6表明数据部分要交给TCP,而值为17表明交给UDP。
- 首部检验和 用于帮助路由器检测收到的IP数据报中的比特错误。只检验首部部分,而不检验数据部分。
- 源、目的IP地址 各32位比特。
- 选项 如果对首部有其他的需求,通过选项字段以扩展首部。
- 数据
IPv6
IPv6使用冒号十六进制记法。 IPv6数据报字段包括:
- 版本
- 流量类型 8比特,与IPv4的TOS字段类似。
- 流标签 IPv6有关于
流(flow) 的定义。该字段用于给属于特殊流的分组加上标签。这些特殊流是发送方要求进行特殊处理的流,比如一种非默认服务质量或需要实时服务的流。 - 有效载荷长度 是一个16比特的无符号整数。指40字节的首部后面的字节数量。
- 下一个首部 指明数据字段交付给哪个协议(如UDP或TCP),其值与IPv4的协议字段相同。
- 跳限制 类似IPv4的寿命字段。
- 源/目的地址 IPv6将地址从32比特增加到128比特。
- 数据
IPv6去除了路由器的分片操作,并移到了网络边缘的主机。由于分片和重装很费时间,因此这大大加快了IP转发速度。在遇到数据报太大的情况时,会向发送方发回一个“分组太大”的ICMP差错报文。
一种广泛的从IPv4迁移到IPv6的方法是
ARP协议
寻址的最终目的一定是MAC地址,那么一个IP数据报怎么找到对应的目的MAC地址呢?这就需要用到
每台主机都有一个
ARP对每一个映射都设置一个生存时间,当过期时就将其删除,这样做避免了因为更换MAC地址而永远找不到对方。
子网划分
使用
CIDR
因特网的地址分配策略是
路由器用分组目的地址的前缀与转发表中的表项进行匹配,而由于转发表中的表项长度可能不同,因此可能出现多个匹配的情况,路由器使用
路由器
路由器包括输入端口、交换结构、输出端口和路由选择处理器。 每台路由器都有一个
输入端口的处理就是查找目的IP地址,然后发送该分组进入交换结构。 交换结构位于路由器的核心部位,通过交换结构,分组从输入端口转发到输出端口。交换有以下几种方式:
- 经内存交换 输入分组被复制到路由选择处理器的内存中,由处理器提取提取地址,找到合适的输出端口,并将分组复制到输出端口的缓存中。
- 经总线交换 让输入端口给分组添加一个标签以指示输出端口。所有输出端口都可以收到该分组,但只有与标签匹配的可以缓存它,并将其标签去除。
- 经互联网络交换 如纵横式交换机。当分组要从端口A到B时,交换机控制器闭合总线A和B的交叉点,然后A发送分组,因此只有B可以收到。与前两者不同,纵横式交换机是非阻塞的。
考虑纵横式交换机中A和B都要向C发送分组。即使输出端口C没有竞争,但A和B则要排队等待。这种现象叫做输入排队交换机中的
如果是很多端口都向A端口发送分组,那么A的缓存可能会不足,此时就要做出决定:要么丢弃新来的分组(
队列可以是普通的FIFO队列,也可以是优先队列,也可以是实现
NAT
可能很多家庭都有相同的诸如192.168.0.0/16这样的IP地址,
DHCP协议
使用
DHCP服务器分配的IP地址是临时的,称这段时间为
一般每个网络至少有一个
控制平面
将整个互联网划分为多个
路由选择协议分为两大类:
内部网关协议IGP(interior gateway protocol) 用于AS内部的路由选择。例如RIP协议和OSPF协议。外部网关协议EGP(external gateway protocol) 用于AS间的路由选择。例如BGP协议。
ICMP协议
主机和路由器用
ICMP报文有一个类型字段和一个代码字段,并且包含引起该ICMP报文首次生成的IP数据报的首部和前8个字节。 ICMP报文有两种:
- 差错报告报文
- 终点不可达(类型值为3) 不能交付数据报时,向源点发送该报文。
- 时间超过(11) 收到TTL为0的报文时,发送该报文。
- 参数问题(12) 收到的数据报首部有字段的值不正确时,发送该报文。
- 改变路由(重定向)(5) 告知主机下次将数据报交给另一个路由器。
- 询问报文
- 回送(echo)请求或应答(8或0) 收到echo请求的必须回发一个echo回答。
- 时间戳请求或回答(13或14) 回发当前的日期。
ICMP报文就放在IP报的数据部分。并且对ICMP差错报文不再发送ICMP差错报文,对第一个分片之后的数据报也不发送ICMP差错报文。另外,对多播或特殊地址的数据报也不发送ICMP差错报文。
RIP协议
RIP协议要求每一个路由器都维护一张它自己到其他每一个目的网络的距离(要注意这里的距离指的是跳数,即经过的路由器数量)记录表,包括目的网络,距离和下一跳地址。RIP协议规定距离的最大值为16,表示不可达。 RIP协议让每个相邻的路由器按固定的时间间隔交换自己的所有已知信息,直到路由表稳定下来(这段时间称为收敛时间),这取决于拓扑结构是否变化。
RIP协议使用