知识备忘录——计算机网络
“The Internet is the first thing that humanity has built that humanity doesn’t understand, the largest experiment in anarchy that we have ever had.”
— Eric Schmidt
本文是对《计算机网络(第六版)》(谢希仁 著)的粗略节选与总结。
计算机网络由节点(计算机、集线器、交换机、路由器等)和链路构成,具有两个重要功能:
- 连通性。使网络中的用户可以交换信息。
- 共享。使得资源可以被共享。
计算机网络有以下性能指标:
- 速率,信息量的单位,表示传送数据的速率(我们会在TCP中见到与此相关的计算),常见单位是位每秒bps(以及Kbps、Mbps、Gbps等)。
- 带宽,指某个信号具有的频带宽度(如2.4GHz等)或是通信线路的数据传送能力(即最高数据率)。
- 吞吐量,单位时间内通过某个网络或信道、接口的数据量,吞吐量必然比数据率小或相等。
- 时延,指数据从网络的一端达到另外一端的所需要的时间。包括:
- 发送时延:,发送端从第一位到最后一位发送所需的时间。
- 传播时延:,从发送端传播到接收端所需的时间。
- 处理时延:收到数据后进行处理所产生的延迟,例如校验差错等。
- 排队时延:由于传输中的机器的吞吐量有限,部分请求可能会被暂存在机器的队列中等待发送,由此带来延迟。
- 时延带宽积,如其名称所指,
时延带宽积=传播时延*带宽
,可以用于表示一条传输链路中的数据量,犹如一根水管,时延是管长而带宽是管径,通过相乘,我们能够知道一条链路的最大容纳数据量。 - 往返时间RTT,表示从发送方发送数据开始到发送方收到接收方的确认所需要的时间。对评估网络性能有重要的作用。
- 利用率,分为信道利用率和网络利用率,其中信道利用率指单位时间内有数据通过信道的百分比;网络利用率则指的是全网络信道利用率的加权和。,这一关系表明当利用率上升到超过50%,时延会显著增加。因此利用率并非越高越好。
# 网络模型
# OSI七层模型
OSI指开放系统互连参考模型。通过分层方式,使得网络的每一层仅需关注其下方一层和本层的协议与实现,从而通过抽象和封装减少网络模型构建中认知超载的问题。OSI模型并非市场化标准。
- 协议:为数据交换建立的规则标准,包含语法语义与同步要素,描述了数据的结构格式,处理的响应动作和时间实现的顺序。
分层实现了对各层的独立标准化和处理,使得每层在连接的两端均是对等处理,从而使得各层能够灵活选择最适合的协议与实现(例如在运输层选择TCP或是UDP),进而适应多变的网络环境,例如实现差错控制和流量管理。OSI模型将网络模型分为七层,自下向上分别是:
- 物理层:网络的物理连接,通过物理方式传输信号,使节点连接起来,例如无线连接、网线连接、光纤以及其相关协议等;
- 数据链路层:在物理层的基础上,将物理连接封装为可靠的数据链路,从而保证数据在局部的链路上正确传输;
- 网络层:负责向不同的主机提供通信服务,使得不同的节点在复杂的异构网络中得知彼此的存在、位置,并提供进行传输;
- 运输层:负责为主机的进程之间的通信提供通信服务,即使数据进程之间能够传输数据;
- 会话层:维护两个主机进程之间的连接的过程,从连接开始到使用到完成;
- 表示层:提供数据的语义和语法分析,如加密解密、压缩解压缩等;
- 应用层:为用户、应用程序提供服务,如HTTP;
# TCP/IP网络模型
TCP/IP模型采用了更加简化的模型描述网络,将层分为网络接口层(对应物理层与数据链路层)、网际层(IP)、运输层(TCP/UDP)、应用层(对应会话层、表示层和应用层)。
# 各层模型知识点汇总
# 物理层
- 物理层的主要任务就是确定与传输媒体的接口有关的一些特性,如机械特性、电气特性、功能特性和过程特性。
- 信号是数据的电气或电磁的表现,分为连续模拟信号和离散数字信号。
- 一个数据通信系统可划分为三大部分,即源系统、传输系统和目的系统。源系统包括源点(或源站、信源)和发送器,目的系统包括接收器和终点(或目的站,或信宿)。来自信源的信号需要经过调制进行传输,调制方法有调频、调幅、调相等。
- 复用是在传输过程中在同一个信道中传输不同用途的信息,常用的信道复用技术有频分复用、时分复用、统计时分复用、码分复用和波分复用(光的频分复用)。
# 数据链路层
数据链路的基本数据单元被称为帧,通过发送端封装后在接收端进行差错检测并交付上层;在这个过程中,数据链路层主要解决三个问题:
- 数据帧的封装:在传输的数据前后分别添加首尾两个部分,用于识别从物理层获取到的数据的首尾。
- 数据帧使用了帧定界符,保证从物理层读取时通过识别首部和尾部定界符确保读取到完整的帧;
- 数据帧有其最大传输单元(MTU),长度过大会导致帧传输失败的代价过高,而过小则会导致首尾占比高,降低传输效率;
- 透明传输:帧中的内容必须不影响对帧的定界,因此需要对传输内容中的定界符进行转义。通常使用的方法有字节填充和字符填充,在发送时添加转义字符ESC,在解析时删除收到的连续转义字符的第一个。
- 差错检测:数据在物理信道中的传输可能会发生改变,从而导致误码,这需要通过差错检测防止错误数据被使用。
- 传输错误的位在单位时间内传输的所有数据位中所占的比例被称为误码率,该指标与信噪比有较大关系,但信噪比极高也不能使误码率下降到零。
- 数据链路层广泛使用循环冗余检验,通过计算冗余码(帧检测序列)实现校验。在生成冗余码时,添加n位0到数据后并除以商定的数字P,得到余数R作为冗余码;在接受时,采用同样的计算,得出余数R',若R'为0,则传输无误。否则需要丢弃该数据帧并重传。
# 数据链路层协议
- 点对点PPP协议:包含封装IP数据报的方法,链路控制协议以及网络控制协议。
- 其特性如下:
- 简单,只收下或者丢弃接收到的帧;
- 实现帧的封装和透明传输以及差错检测;
- 支持多种网络层协议和链路类型;
- 检测连接状态、数据压缩、协商网络层地址等;
- 帧格式:
1. 首部:字节F(0x7f)|A|C|协议(标示网络层协议类型); 2. 信息字段:上层数据部分,长度由MTU决定,通常不超过1500字节; 3. 尾部:帧检验序列|F(0x7f);
- 透明传输:
- 使用字节填充,将0x7e转化为两字节序列;
- 使用零比特填充,识别到连续的5个1就在后方填充一个0,接收时删除5个连续1后的0;
- 其特性如下:
- CSMA/CD协议:同一时间只允许一台计算机进行数据发送,若检测到多台机器发送数据,则同时停止,等待新的发送。CSMA/CD是使用广播信道的数据链路协议,在局域网中使用,其名称为载波监听多点接入/碰撞检测。
- 局域网的网络拓扑:对于一个有m个节点的局域网,拓扑类型有星型网(m条线连接到集线器)、环形网(m条线连接到一条环形线)、总线网(m条线连接到一条总线);CSMA/CD协议采用总线型网络;
- 数据编码:采用曼彻斯特编码,使用电平的变化表示编码,如0为低变高,1与之相反;差分曼彻斯特编码采用遇1改变波形的方式,如1000电平波形相同,1111每个相邻电平波形正好相反;曼彻斯特编码的缺点是占用的频宽是普通编码方式的两倍(一个码元有两个电平);
- 载波监听与碰撞检测:边发送边监听,检测信道。发送数据会由于延迟导致碰撞产生,往返时间被用作碰撞窗口,在发送后经过该窗口且未检测到碰撞(确保了其他机器未发送),就可以继续发送帧。碰撞后使用随机推迟避免再次碰撞,随机数值取整数集合,k为重传次数和10的最小值;重传达16次报告高层;
- 无效帧:小于64字节的帧会导致检测到碰撞时已经传输完毕(在10Mb/s网络中,争用期为51.2μs),因此应当丢弃;
- 强化碰撞:发生碰撞时,发送人为干扰信号,通知其他机器;
- 信道共享机制:分为静态划分信道(物理层复用机制)与动态接入控制(随机接入与受控接入);局域网使用后者,采用了逻辑链路控制LLC与媒体接入控制MAC;MAC机制:MAC帧使用了物理地址,通过标识系统中唯一的标识符区分物理设备;
- MAC帧格式:
前同步码(10交替,7字节)|帧定界符(10101011,11作为接收准备标识) 目的地址|源地址|类型(上层协议)|数据 FCS帧校验码|通过曼切斯特编码的电平不再变化得知帧的结束
- MAC区分单播、多播和广播来控制帧的接收;
- 物理层拓展以太网:通过集线器拓展以太网可连接更多、更远的设备,但会形成更大的碰撞域(更多机器被视为在一个以太网内,提升了碰撞概率)并导致向下兼容带来性能降低;
- 数据链路层拓展以太网:使用网桥通过MAC帧的目的地址对帧进行转发和过滤;
- 网桥:网桥连接了多个网段,每个网段即是原来的一个以太网,在连接后,它们仍然是独立的碰撞域。每个网桥都有自己的转发表,用于记录目标地址对应的接口。
- 保证可靠性、兼容性的同时扩大网络物理范围和吞吐量;
- 存在增加时延、缺少流量控制、导致广播风暴的问题;
- 自学习算法:与透明网桥有关;收到帧后按照发送地址记录该地址对应的接口,逐步建立转发表;需要将帧转发到所有接口,以逐步建立整个网络中的路由转发表;过期的记录会被删除,同时使用生成树算法避免帧回环;
- 虚拟局域网(VLAN):可通过交换机实现,以类似点对点的方式表现,通过广播实现通信,可以跨越多个物理以太网;在MAC帧中源地址后插入了4字节标记信息;
- 网桥:网桥连接了多个网段,每个网段即是原来的一个以太网,在连接后,它们仍然是独立的碰撞域。每个网桥都有自己的转发表,用于记录目标地址对应的接口。
# 网络层
网络层通过数据报的方式,向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务,不提供服务质量承诺。网络层中使用路由器作为中间设备,总是具有两个及以上的不同IP地址。路由器连同网桥等,将异构网络中的设备连接到一个虚拟互连网络中,使其在网络层看起来如一个统一的网络。
# 网络层协议
- IP协议:网际协议IP使互连起来的许多计算机网络能够进行通信;对于该网络中的每个节点,都使用一个唯一的标识符进行区分,称为IP地址;IP地址采用分类法、子网划分法或超网法进行编址;
- IP数据报:
+--------------------首部固定部分20字节-----------------------+ |版本 4bit|首部长度 4bit|区分服务 8bit| 总长度 16bit | |标识 16bit(计数器,用于组装分片) |标志 3bit|片偏移 12bit | |生存时间 8bit |协议 8bit | 首部检验和 16bit | |源地址 32bit | |目的地址 32bit | +------------------------可变部分-----------------------------+ |可选字段 | 填充至32bit | +------------------------数据部分-----------------------------+ |数据部分 |
- 标志位3bit:MF表示更多分片与DF表示不能分片;
- IP数据报的长度与分片:IP数据报假定上层交付最大512字节数据,结合自身头部最长60字节及4字节富余,使报文长度不超过576字节,否则询问是否分片;分片是将IP数据报拆分填充到MAC帧中,使用标志位、片偏移、标识联合记录分片结果。分片在网络层实现,将原数据报转化为多个新数据报;
- 生存时间(TTL),以秒为单位,每经过一个路由器且消耗时间小于1s,就会对TTL减1,收到TTL为0则丢弃,以防止消耗网络资源;现在改为路由器跳数;
- 首部校验和:只校验数据报的首部,不包括数据部分;将数据分为16位字后反码加和写入字段,接收后使用相同操作,结果为0则保留;
- 可变部分:1-40字节,使用全0填充至4字节整数倍的长度;
- IP地址分类法:使用
{网络号,主机号}
构成IP地址并实现分类。背景是网络异构性导致的网络内主机数量不均,网络号对应分配给单位的网络,主机号全1表示网络号内全部主机,全0表示本主机。其分类如下:
全0可作为源地址使用,全1可作为目标地址使用,但反之不可;路由器可仅根据目的主机所连接的网络号转发数据报,从而减少路由表存储占用和查表时间;使用集线器、网桥等连接的若干互联网仍使用同一个网络号;类型 构成 作用 典型地址 特殊情况 网络号数 主机号数 A 0b0 + 7bit网络号 + 24bit地址号 单播 127.0.0.1 127开头作为环回测试地址 B 0b10 + 14bit网络号 + 16bit地址号 单播 128.1.0.0 128.0.0.0不分配 C 0b110 + 21bit网络号 + 8bit地址号 单播 192.0.1.0 192.0.0.0不分配 D 0b1110 + 28bit 多播 E 0b1111 + 28bit 保留 - 划分子网:两级IP存在不够灵活、分配不合理的问题,故而引入划分子网;
- 将物理网络划分为若干子网,子网对外部不可见;
- 子网地址借用主机号,改为
{网络号,子网号,主机号}
; - 路由表仍然通过网络号进行路由转发,在到达路由后,通过子网掩码获取下一跳的子网路由;
- 子网掩码使用连续1表示,通过按位与计算得到子网路由地址;
- 若不划分子网,则使用默认子网掩码,与前缀+网络号位数相同;
- 无分类编址(构成超网):不再使用网络地址分类,取消ABC类网络地址和划分子网概念;
- 使用
{网络前缀,主机号}
方法构造,采用斜线记法,如192.168.0.0/16
,其中16表示前十六位网络前缀; - 网络前缀相同的连续IP地址组成CIDR地址块,采用类似子网掩码的地址掩码;
- CIDR通过路由聚合减少了路由表项,从而提升网络性能;通过灵活分配前缀实现了IP的灵活分配;
- 不同长度的前缀带来了多项路有记录匹配问题,使用最长前缀匹配原则;
- 快速查找最长前缀的方法是:二叉线索,构造唯一线索;
- 使用
- 划分子网:两级IP存在不够灵活、分配不合理的问题,故而引入划分子网;
- 路由表:路由表中每一行表示三个元素
{目的网络地址,子网掩码,下一跳地址}
,通过记录网络号而非主机号简化路由表;- 默认路由:适用于小网络,使用
0.0.0.0
表示; - 分组转发算法:
1) 根据目的主机的IP地址D和子网掩码,提取目的网络网址N; 2) 若N直连,则直接交付; 3) 若有D的特定主机路由,则交付所指的下一跳路由器; 4) 计算路由表中各行的子网掩码与D的按位与,如有到达N的路由,则交付所指下一跳路由; 5) 如有默认路由,则交付所指默认路由器; 6) 以上均无,报告出错;
- 默认路由:适用于小网络,使用
- IP数据报:
- ARP:IP地址需要转化为MAC地址,从而在数据链路上传输以到达目标IP地址,所使用的协议即ARP(地址解析协议)。ARP协议存放了IP地址到硬件地址的映射表,该表会随网络结构变化频繁变动。
- ARP请求:在局域网上广播ARP请求可以得到目标IP地址对应的MAC地址,其他主机不理会该请求;ARP请求包含源地址IP,从而更新目的地址ARP缓存,减少ARP请求数量;
- 高速缓存:ARP使用高速缓存记录映射,每个映射有其生存时间,过期后即被删除;
- ARP仅仅解决同一个局域网上的IP地址到MAC地址映射,在解析地址后,需将IP数据报封装为MAC帧;
- ICMP:网际控制报文协议,实现差错和异常报告;
- 数据报格式:在IP数据报的数据部分:
|类型 8bit|代码 8bit|校验和 16bit| |取决于报文类型 32bit |数据部分|
- 类型分为:差错报告和ICMP询问报文;
- 常用于Ping指令、traceroute指令;
- 路由选择协议:获取路由表中的项目的算法——算法应当正确完整、计算简单、自适应网络变化、稳定、公平且适合所对应网络;
- 分为静态路由协议与动态路由选择协议;
- 使用自治系统对外表现一个单一的路由和路由选择策略;使用内部网关协议(自治系统内)和外部网关协议(自治系统间);
- 内部网关协议:
- RIP:路由信息协议,基于距离向量,距离指到某路由器的跳数,最高15跳,只适用于小型互联网;
- 仅和相邻路由器交换信息;交换信息是自己的路由表;按固定时间间隔交换路由;
- 通过Bellman-Ford算法实现计算:对于路径A->B,有最短路径上节点X,则A->X,X->B是AX、BX间的最短路径;
- 报文格式:通过UDP传播,报文内容位于UDP数据部分;包含首部4字节(命令、版本、16bit全0)、路由部分(地址族标识符、路由标记、网络地址、子网掩码、下一跳路由器地址、距离);
- 实现简单、开销较小、收敛快速,但网络故障时,需要较长的时间传递该信息;
- OSPF:开放最短路径优先协议;使用最短路径算法及分布式的链路状态协议;
- 向本自治系统的所有路由器发送信息;采用洪泛法传播信息(在下一时刻向收到信息的路由器之外的路由器发送信息);发送的信息是所有相邻路由器的链路状态(链接和度量);链路变化时才发送信息;
- 可建立自治系统内的全网拓扑结构;更新过程收敛快速;
- 报文格式:使用IP数据报,分首部部分(版本、类型、分组长度、路由器标识符、区域标识符、检验和、鉴别类型、鉴别字段)和OSPF分组数据;
- 每10s在相邻路由器间交换分组,从而确认可达性;使用数据库描述分享链路状态项目,使用链路状态更新分组更新状态,使用确认分组确认更新;
- 通过Dijkstra算法计算路由最短路径,使用指定路由器方法减少广播信息量;
- RIP:路由信息协议,基于距离向量,距离指到某路由器的跳数,最高15跳,只适用于小型互联网;
- 外部网关协议BGP
- 因特网规模太大,使AS之间的路由选择困难;
- 只寻找一条可达且较好的路径,不寻找最佳路径;
- 通过BGP路由器作为发言人(通常是边界路由器)建立TCP连接建立BGP会话,形成对等节点;
- 报文格式:存储在TCP报文数据部分,包含通用首部(标记、长度和类型)和主体部分;
- 使用OPEN报文建立对等;使用UPDATE报文通知路由记录的变更,仅增加一条,可撤销多条;使用KEEPALIVE报文确认对方存在;使用NOTIFICATION报文报告差错;
- IP多播
- 通过一对多通信减少单播,节约网络资源;
- 局域网使用硬件多播,不需要复制;但通常需要复制多播数据报;
- 使用D类地址(224.0.0.0-239.255.255.255)作为多播地址;尽最大努力交付,不保证一定交付;
- 多播所需协议:IGMP(网际组管理协议)、多播路由选择协议;
- IGMP协议是让连接在本地局域网上的多播路由器知道本局域网上是否有主机(严格讲,是主机上的某个进程)参加或退出了某个多播组;
- 多播路由选择,实际上就是要找出以源主机为根节点的多播转发树,从而降低多播代价;使用洪泛与剪除、隧道技术、基于核心发现三种方法实现;
- 虚拟专用网VPN与网络地址转换NAT
- 专用地址:10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16,仅用于与内部网络地址通信;
- 虚拟专用网:构成跨越物理网络的虚拟的专用网,通过隧道技术实现;
- NAT使内部网络地址轮流使用有限的全球IP地址,从而节省IP;进一步的,利用运输层端口的NAPT可节省更多;
# 运输层
运输层是面向通信的最高层,也是面向应用功能的最底层,向上提供端到端(以进程为基本单位)的通信。提供复用和分用功能,复用指不同进程可用同一个协议传输数据,分用指接收方获取的数据能够正确交付上层的对应进程。运输层会进行数据报数据部分的差错检测。分为面向连接的TCP协议(可视为稳定可靠的双工通道)和面向数据报的UDP协议(不可靠)。
# 运输层协议
- 端口:用于区分机器上的进程所使用连接的标识,采用16位整数标识(0-65535),在客户端-服务器交互模式中,服务端的分类有熟知端口号(系统端口号,如FTP-21、SSH-22、HTTP-80、HTTPS-443等)和登记端口号(应用的端口号,如MySQL-3306、Redis-6379、MongoDB-27017等),客户端的端口号(短暂端口号)从49152开始0。
- UDP协议:在IP协议的基础上增加了复用、分用和差错检测的功能;
- UDP无连接(发送数据不需要连接,减少时延和通信开销),尽最大努力交付(主机不维持链接状态表),面向报文(保留上层报文边界,不做拆分合并),没有拥塞控制(不会降低发送速率,从而保证实时性,如视频会议等,但需要更高层提高可靠性)。
- UDP首部开销为8字节,支持一对一、一对多、多对一和多对多通信,报文格式:另外在该首部前有伪首部,其中信息根据IP报文产生,并参与且只参与校验和计算(计算包括伪首部、首部、数据部分,采用类IP校验和的分片反码和校验方法)。
|源端口 2byte|目的端口 2byte|长度 2byte|检验和(数据) 2byte|数据部分|
- TCP协议:面向连接的点对点双工通信,可靠交付(无差错、按发送顺序到达),面向流传输(数据看作无结构的字节流),具备差错控制和拥塞控制功能。
- 连接方式:通过套接字
{IP地址,端口号}
表示连接的端点,与进程无关,因此一个进程可以具有多个TCP连接。 - 可靠传输方式:
- 停止等待协议:无差错时,发送得到确认即发送下一段报文;出现差错时,进行超时重传——若某分组(发送端保留副本并编号)长时间未收到回复,则重传该分组,重传时间应大于TTL,防止因时延变高导致的过多重传;传输超时但接收端收到后,丢弃重传帧并重传确认,发送端收到的第一个确认才有效;实现简单,但信道利用率低,因为RTT时间被浪费;
- 流水线传输:包含连续ARQ协议,滑动窗口协议;
- ARQ协议:通过滑动窗口连续发送分组但并不等待确认,通过累计确认(确认最后一个正确到达的分组编号)实现滑动窗口前移;若窗口内后续分组丢失,则再次重传(回退);ARQ在低质量通信线路上效果不佳,不能反馈正确发送的分组信息,但容易实现;
- 以字节为单位的滑动窗口:窗口序号表示允许发送的序号;窗口后的部分表示已经收到的内容,无需保留;窗口前的内容需要放到临时缓存空间;窗口主要的变化是不动和前移,向后收缩不是良好实践;允许发送但尚未发送的部分被称为可用窗口;发送窗口并不总与接收窗口等大,需要将缺失的数据接收后按序向上层交付,接收方应当有累计确认;
- Karn算法(计算超时重传时间):在计算加权平均时,只要报文段重传了,就不采用其往返时间样本。这样得出的加权平均和就较准确;
- 流量控制:确保接收方来得及接收发送的内容;流量控制会缩小接收窗口的大小,若缩小至零窗口,则不能发送,TCP使用持续计时器,在到期时发送携带1字节数据的探测报文段获取新窗口值;发生糊涂窗口综合征(接收方处理缓存数据的速度很慢)时,让接收方等待一段时间,或等待缓存空闲一半以上);接收方维持的接收窗口rwnd必须大于等于发送窗口;
- 拥塞控制:对网络中某一资源的需求超过了所能提供的部分,则会发生拥塞;拥塞控制是防止注入过多数据,对于网络是全局的;当拥塞发生时,分组很可能因为超时被丢弃,同时网络的吞吐量下降到0,网络无法工作产生死锁;为此,发送方维持拥塞窗口cwnd,使自己的发送窗口等于拥塞窗口,从而控制发送量;
- 慢开始:在无拥塞时,逐步增大窗口;发送方每次收到接收方的确认(在一个传输轮次RTT内),就将窗口增大一倍;当窗口大于等于慢开始门限(通常是拥塞窗口值的一半)后,就使用拥塞避免算法;
- 拥塞避免:使用线性增长方式,当拥塞发生就把cwnd减少到1并执行慢开始;
- 快重传:收到失序报文段后及时通过重复确认通知发送方;发送方收到三个重复确认就应当发送尚未收到的报文段;
- 快恢复:配合快重传,收到三个重复确认时,将慢开始门限减半,从而预防拥塞;使用快恢复时,新窗口值设置为慢开始门限;
- 随即早期丢弃:在一个区间随机丢弃新到达的分组;
- TCP报文格式:
|源端口 16bit | 目的端口 16bit | |序号 32bit | |确认号 32bit | |数据偏移 4bit|保留 6bit|URG 1bit|ACK 1bit|PSH 1bit|RST 1bit|SYN 1bit|FIN 1bit|窗口 16bit | |校验和 16bit |紧急指针 16bit | |选项 长度可变 |填充 | |数据部分 |
- 序号:采用mod计算,即回环表示,与传输的字节流长度挂钩,如携带序号301的报文携带100字节数据,则下一报文以401为序号;
- 确认号:期望收到对方下一个报文段的第一个数据字节的序号,如B收到A发送的501序号的200字节长的报文,则其确认号为701,表示期望收到的报文序号为701;能够表示到序号N-1的数据都已经正确收到;
- 数据偏移:由于TCP报文中的选项部分和填充,需要使用偏移表示数据段开始位置,最大值为60字节,单位是1个字(4字节32位);
- URG:紧急位,表示该报文具有高优先级,在插入队列是放入最前,与紧急指针配合使用,如终端命令发出后优先发送中断相关报文;
- ACK:确认位,表示确认号有效性,连接后ACK应均为1;
- PSH:推送位,置为一时不等待填满缓存即发送,较少使用;
- RST:复位位,表示必须释放连接并拒绝非法链接;
- SYN:同步位,在连接时使用,置为一时表示连接请求或接收连接报文;
- FIN:终止位,表示数据发送完毕,要求释放连接;
- 窗口:表示接收窗口,从确认号算起,允许对方发送的数据量,会动态变化;
- 检验和:采用同UDP类似的方式计算;
- 紧急指针:指出紧急数据的字节数,即将数据部分划分数据前后为紧急数据和普通数据,窗口为0也可发送紧急数据;
- 选项:最长40字节,包含最大报文段长度(数据部分长度,默认值表示536字节)、窗口扩大选项(3字节,表示窗口长度按位增加)、时间戳选项(10字节,4字节时间戳+4字节时间戳回送回答,可计算RTT,并通过时间戳区分新报文和旧报文,防止序号绕回)、选择确认选项(对于不连续的数据,通过边界告知不需要重复发送的数据部分);
- TCP连接管理:
- TCP连接建立(三次握手):
- 一方主动打开连接,另一方被动打开(从CLOSED进如LISTEN);
- (第一次握手)发送方发送同步位SYN=1,初始序号seq=x的不带数据的报文段,消耗一个序号,从CLOSED进入SYN-SENT;
- (第二次握手)接收方收到后,发送SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y的不带数据的报文,消耗一个序号,从LISTEN进入SYN-RCVD;这一步确认了发送方的发送能力以及接收方的接受能力;
- (第三次握手)发送方收到接收方的报文后,发送ACk=1,确认号ack=y+1,序号seq=x+1的确认报文;若不携带数据,则不会消耗序号,双方进入ESTABLISHED状态;这一步确认了发送方的接收能力和接收方的发送能力;
- TCP连接释放(四次挥手):
- 一方主动关闭,另一方在通知应用进程后被动关闭;
- (第一次挥手)发送方发送FIN=1, 序号seq=u(u等于最后一个字节序号+1)的报文;不带数据,消耗一个序号;发送方进入FIN-WAIT-1状态,等待接收方确认;
- (第二次挥手)接收方发送ACK=1,确认号ack=u+1,序号seq=v(v等于最后一个字节序号+1)的报文;接收方进入CLOSE-WAIT,发送方收到后进入FIN-WAIT-2;此时释放了发送方到接收方的数据发送连接,仍然保留单工通信;
- (第三次挥手)接收方收到应用程序要求被动关闭,发送FIN=1,ACK=1,序号seq=w,确认号ack=u+1的报文;接收方进入LAST-ACK;
- (第四次挥手)发送方发送ACK=1,seq=u+1,ack=w+1的确认报文;发送方进入TIME-WAIT,等待2连个最长报文段寿命(MSL);接收方在收到确认后进入CLOSED;
- TIME-WAIT的原因:保证发送方发送的最后一个报文到达接收方(2MSL可保证双向的重传);防止失效连接请求出现在本连接中(使得报文段从网络中消失);
- 使用keepalive计时器:防止服务器空等待已经关闭的客户端;
- TCP连接建立(三次握手):
- 连接方式:通过套接字
# 会话层
# 表示层
# 应用层
在TCP/IP模型中,这三层被合并表示为应用层。由于这三层的作用已经在前面描述过,这里会以汇总的形式总结。
# 应用层协议
- HTTP:
- HTTPS:
- DNS:分布式的域名系统,解析名称并对应到IP地址;通过解析程序发送UDP至服务器,获取域名对应的IP地址;
- 域名通过点(
.
)分隔,每个标号不超过63字符,分为顶级域名、二级域名、三级域名,按倒序排列;域名以域名树的方式进行表示最为合适,根部是根域名,没有对应名字,以下每一层依次对应顶级域名、二级域名等;域名应当是互联网中唯一的; - 域名使用服务器分布管辖,依照域名树的层次进行组织,根对应根域名服务器,顶级域名对应顶级域名服务器,依次往下对应各层权限域名服务器;
- 根域名服务器知道所有顶级域名服务器的域名和IP地址;DNS服务器能够就近找到其中之一;
- 顶级域名服务器:负责管理该顶级域名的二级域名内容;
- 权限域名服务器和本地域名服务器:权限域名服务器不能返回结果时,就要到下一个权限域名服务器访问;本地域名服务器使用本地缓存,并进行迭代查询;
- 域名通过点(
- RPC:
v1.5.2