计算机网络
笔记来源于 B站湖科大计网视频 如果是第一次学计网的墙裂推荐这门课
计算机网络体系结构:
网络接口层并没规定什么标准,主要是为了能兼容多种网络接口,实质上TCP/IP结构可认为只有网际层,运输层和应用层三层
- 应用层:HTTP,SMTP...............DNS....................RTP
- 运输层:TCP ,UDP
- 网际层:IP
IP协议互连不同的网络接口,也为各种网络应用提供服务
原理体系结构划分:
应用进程基于网络的通信:
请求的传递需要经过层层封装
数据链路层:
数据链路层以帧为单位传输和处理数据
封装成帧:
指数据链路层给上层交付的协议数据单元添加帧头和帧尾使之成为帧
帧头和帧尾的作用之一就是帧定界
数据链路层需要达到的理想效果是透明传输:即对上层交付的数据没有任何限制,无论是什么格式都能完成任务
- 面向字节的物理链路使用字节填充的方法(如插入转义字符,占用一个字节。十进制值为27)
- 面向比特的物理链路使用比特填充的方法(例如每5个连续的1后面添加一个比特0)
想提高传输效率帧的数据部分应该尽可能长
差错检测:
使用差错检测码来检测数据在传输过程中是否产生了比特差错
奇偶检验漏检率高
循环冗余校验CRC:
算法要求生成多项式必须包含最低次项 检错码只能表明出现差错,无法定位错误
可靠传输:
若提供不可靠服务,仅丢弃有误码的帧,其他什么都不做
提供的是可靠服务,则要实现发送了什么,就一定能接收到什么
除了比特差错,传输差错还包括分组丢失,分组失序和分组重复,这些一般不出现在数据链路层,所以可靠传输服务可由各层选择是否实现
- TCP提供面向连接的可靠传输服务
- UDP提供无连接不可靠传输服务
- IP提供无连接不可靠传输服务
停止等待协议SW(Stop-and-Wait):
发送方发送完一个数据分组后停止发送,等待接收方的确认分组或否认分组,若是否认分组则需要重传
但接收方收不到数据分组,就不会发送ACK或NAK。如果不采取其他措施,发送方就会一直处于等待接收方ACK或NAK的状态。
为解决该问题,可以在发送方发送完一个数据分组时,启动一个超时计时器。若到了超时计时器所设置的重传时间而发送方仍收不到接收方的任何ACK或NAK,则重传原来的数据分组,这就叫做超时重传。
一般可将重传时间选为略大于“从发送方到接收方的平均往返时间”
除了数据分组可能丢失,接收方发送的确认分组也可能丢失,那么就会引起发送方的超时重传从而导致分组重复
为避免分组重复这种传输错误,必须给每个分组带上序号。
对于停止-等待协议,由于每发送一个数据分组就停止等待,只要保证每发送一个新的数据分组,其发送序号与上次发送的数据分组的序号不同就可以了,因此用一个比特来编号就可以了。同理,接收方的确认分组也需要编号
停止等待协议信道利用率很低
回退N帧协议GBN(Go-Back-N):
采用n个比特位给分组编号,发送方需要维护一个发送窗口。接收方的接收窗口值固定为1。
累计确认: 接收方不一定要对收到的数据分组逐个发送确认,而是可以在收到几个数据分组后(由具体实现决定),对按序到达的最后一个数据分组发送确认。ACKn表示序号为n及以前的所有数据分组都已正确接收。
回退N帧协议在流水线传输的基础上利用发送窗回来限制发送方连续发送数据分组的数量,是一种连续ARQ协议。在协议的工作过程中发送窗回和接收窗口不断向前滑动,因此这类协议叉称为滑动窗回协议。
由于回退N帧协议的特性,当通信线路质量不好时,其信道利用率并不比停止-等待协议高。
回退N帧协议的接收窗口尺寸WR只能等于1,因此接收方只能按序接收正确到达的数据分组。一个数据分组的误码就会导致其后续多个数据分组不能被接收方按序接收而丢弃(尽管它们无乱序和误码)。这必然会造成发送方对这些数据分组的超时重传,显然这是对通信资源的极大浪费。
选择重传协议SR(Select Request):
为了进一步提高性能,可设法只重传出现误码的数据分组。因此接收窗口的尺寸WR不应再等于1(而应大于1),以便接收方先收下失序到达但无误码并且序号落在接收窗口内的那些数据分组,等到所缺分组收齐后再一并送交上层。这就是选择重传协议。
注意: 选择重传协议为了使发送方仅重传出现差错的分组,接收方不能再采用累积确认,而需要对每个正确接收到的数据分组进行逐一确认!
否则无法分辨新,旧数据分组
点对点协议PPP:
PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法,主要由以下三部分构成:
- 对各种协议数据报的封装方法(封装成帧)
- 链路控制协议LCP,用于建立、配置以及测试数据链路的连接
- 一套网络控制协议NCPs其中的每一个协议支持不同的网络层协议
点对点协议PPP的帧格式:
使用PPP协议的数据链路层不提供可靠服务
MAC(Medium Access Control)地址:
- 媒体接入控制:协调多个发送和接收站点对一个共享传输媒体的占用
使用点对点信道的数据链路层不需要使用地址,因为只有2台主机。但在使用广播信道的数据链路层中,必须使用地址来区分各主机,每个主机都必须有一个唯一的标识,即一个数据链路层地址;
在每个主机发送的帧中必须携带标识发送主机和接收主机的地址。由于这类地址是用于媒体接入控制MAC(Media Access Control),因此这类地址被称为MAC地址
- MAC地址一般被固化在网卡(网络适配器)的电可擦可编程只读存储器EEPROM中,因此MAC地址也被称为硬件地址或物理地址,但MAC地址不属于物理层!
- 一般情况下,用户主机会包含两个网络适配器:有线局域网适配器(有线网卡)和无线局域网适配器(无线网卡)。每个网络适配器都有一个全球唯一的MAC地址。而交换机和路由器往往拥有更多的网络接口,所以会拥有更多的MAC地址。综上所述,严格来说,MAC地址是对网络上各接口的唯一标识,而不是对网络上各设备的唯一标识。
MAC地址格式:
共6字节,一般将每4个一节以一个16进制数表示,即以12个16进制符号表示
- 单播MAC地址:只与一个目标主机地址匹配,只有一个主机能接收
- 多播MAC地址:与多个目标主机地址匹配,所有多播组包含该地址的主机可以接收
- 广播MAC地址:与该网络中的所有主机地址都匹配,任意主机都可接收
IP地址:
IP地址是因特网上的主机和路由器所使用的地址,用于表示两部分信息
- 网络编号:标识因特网上数以百万计的网络
- 主机编号:标识同一网络上不同的主机(或路由器接口)
在数据包转发过程中,源IP地址和目的IP地址保持不变,源MAC地址和目的MAC地址随逐个链路(或逐个网络)改变
地址解析协议ARP:
如何通过IP地址获得MAC地址:
- 每一个主机都有ARP高速缓存表,若在表中没有查到目标IP地址的MAC地址,则发送ARP请求报文广播帧
- 主机通过发送装有ARP请求的广播帧,目标主机收到请求报文后返回响应,告知自己的MAC地址(返回的响应ARP报文为单播帧)
IP地址与MAC地址的对应关系不是永久的,ARP协议只能在单个网络中使用,不能跨网络使用,ARP没有安全验证机制,存在ARP欺骗等问题
网络层:
网络层的主要任务是实现网络互连,解决网络与网络之间通信的问题,实现数据包在各网络之间的传输
需解决的主要问题:
- 向上层提供可靠还是不可靠的服务
- 网络层寻址问题
- 路由选择问题
网络层提供·的两种服务:
- 面向连接的虚电路服务
可靠通信由网络来保证,通信双方必须建立网络层的连接——虚电路(Virtul Circuit),通过已建立连接的虚电路发送分组。目的主机的地址仅在连接建立阶段使用,之后每个分组的首部只需携带一条虚电路的编号(构成虚电路的每一段链路都有一个虚电路编号)。
这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确到达接收方(无差错按序到达、不丢失、不重复)。
通信结束后,需要释放之前所建立的虚电路。
- 无连接的数据报服务
可靠通信由用户主机保证,通信前无需建立网络层连接,每个分组可走不同的路径,每个分组的首部必须携带目的主机的完整地址,这种方式传送的分组可能有误码,丢失,重复和失序情况
由于网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比较)。因特网采用了这种设计思想,也就是将复杂的网络处理功能置于因特网的边缘(用户主机和其内部的运输层),而将相对简单的尽最大努力的分组交付功能置于因特网核心。
IPv4地址:
IPv4地址就是给因特网(Internet)上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32比特的标识符。
表示方法:
分类编址
A类地址:网络号固定为8位,主机号为24号,网络号首位固定为0:
B类地址:网络号固定为16位,主机号固定为16位,网络号前两位固定为10:
C类地址:网络高固定为24号,主机号固定为8位,网络号前3位固定为110:
注意下列情况的地址不能分配给主机或路由器接口:
- A类网络号为0或127
- 主机号为全0,这是网络地址
- 主机号为全1,这是广播地址
划分子网的IPv4地址:
32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号。
- 子网掩码使用连续的比特1来对应网络号和子网号
- 子网掩码使用连续的比特0来对应主机号
- 将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可得到IPv4地址所在子网的网络地址
在子网中主机号全0或全1也是不能分配的,主机号全0用来标识网络地址,全1标识广播地址
无分类编制的IPv4地址:
CIDR使用“斜线记法”,或称CIDR记法。即在IPv4地址后面加上斜线“”,在斜线后面写上网络前缀所占的比特数量。
IP数据报发送和转发过程
路由器隔离广播域,遇到广播报文不会转发
静态路由配置
静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表。这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化。一般只在小规模网络中采用。
这种方式可能出现一下导致路由环路的错误:
- 配置错误
- 聚合不存在的网络(可向路由表加入黑洞路由解决)
- 网络故障
特殊的静态路由条目:
- 默认路由(目的网络为0.0.0.0,地址掩码为0.0.0.0)
- 特定主机路由(目的网络为特定主机的IP地址,地址掩码为255.255.255.255)
- 黑洞路由(下一跳为null0)
路由选择协议
路由器通过路由选择协议自动获取路由信息,实现动态路由选择
路由选择协议根据通信时域间通信还是域内通信可分为内部网关协议IGP和外部网关协议EGP
内部网关协议IGP(例如路由信息协议RIP或开放最短路径优先OSPF)
- 设法使分组在一个自治系统内尽可能有效地从源网络传输到目的网络
- 无需考虑自治系统外部其他方面的策略
路由信息协议RIP(Routing Information Protocol)
RIP要求自治系统AS内的每一个路由器都要维护从它自己到AS内其他每一个网络的距离记录。这是一组距离,称为距离向量D-V(Distance-Vector)。
RIP使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离。
- 路由器到直连网络的距离定义为1.
- 路由器到非直连网络的距离定义为所经过的路由器数加1。
但一条路径最多只能包含15个路由器,相当于距离为16时不可达,所以RIP只适用于小型互联网
RIP协议认为好的路由是距离短的路由,优先选择通过路由器数量最少的路由,
基本工作流程:
- 路由器刚开始工作时,只知道自己到直连网络的距离为1。
- 每个路由器仅和相邻路由器周期性地交换并更新路由信息。
- 若干次交换和更新后,每个路由器都知道到达本AS内各网络的最短距离和下一跳地址,称为收敛。
RIP存在路由环路问题或距离无穷计数问题,这是距离向量算法的一个固有问题。可以采取多种措施减少该问题出现的概率和带来的危害
- 限制最大路径距离为15(16标识不可达)
- 当路由表发生变化时就立刻发送更新报文,而不是周期性发送
- 让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送(即“水平分割”)
开放最短路径优先OSPF(Open Shortest Path First)
使用了Dijkstra的最短路径算法所以叫最短路径优先
- OSPF是基于链路状态,而不是像RIP基于距离向量
- OSPF采用SPF算法计算路由,保证不会产生路由环路
- OSPF不限制网络规模,收敛速度快
基本工作流程:
OSPF相邻路由器之间通过问候(Hello)分组,建立和维护邻居关系,如:
其中在多点接入网络中,OSPF会选举指定路由器DR(designated router)和备用的指定路由器BDR(backup designated router),所有的非DR/BDR只与DR/BDR建立邻居关系,非DR/BDR之间通过DR/BDR交换信息
发送周期为10秒,若40秒未收到来自邻居路由器的Hello分组,则认为该邻居路由器不可达
-
使用OSPF的每个路由器都会产生链路状态通告LSA(Link State Advertisement)。LSA中包含以下内容:
- 直连网络的链路状态信息
- 邻居路由器的链路状态信息
-
LSA被封装在链路状态更新分组LSU中,采用洪泛法发送。所有收到LSA的路由器进行洪泛转
-
使用OSPF的每个路由器都有一个链路状态数据库LSDB,用于存储LSA。通过各路由器洪泛发送封装有自己LSA的LSU分组,各路由器的LSDB最终将达到一致。
-
使用OSPF的各路由器基于LSDB进行最短路径优先SPF计算,构建出各自到达其他各路由器的最短路径,即构建各自的路由表。
OSPF有五种分组类型:
- 问候(Hello)分组:用来发现和维护邻居路由器的可达性。
- 数据库描述(Database Description)分组:向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息
- 链路状态请求(Link State Request)分组:向邻居路由器请求发送某些链路状态项目的详细信息
- 链路状态更新(Link State Update)分组:路由器使用这种分组将其链路状态进行洪泛发送,即用洪泛法对全网更新链路状态。
- 链路状态确认(Link State Acknowledgment)分组:这是对链路状态更新分组的确认分组。
边界网关协议BGP
外部网关协议EGP(例如边界网关协议BGP)
- 在不同自治系统内,度量路由的“代价”(距离,带宽,费用等)可能不同。因此,对于自治系统之间的路由选择,使用“代价”作为度量来寻找最佳路由是不行的。
- 因此BGP只是力求能找到一条能到达目的网络且相对较好的路由,而不是寻找最佳路由
基本工作原理
-
在配置BGP时,每个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP发言人",不同自治系统的BGP发言人要交换路由信息,首先必须建立TCP连接,端口号为179
- 在此TCP连接上交换BGP报文以建立BGP会话
- 利用BGP会话交换路由信息(例如,增加新的路由,或撤销过时的路由,以及报告出错的情况等)
- 使用TCP连接交换路由信息的两个BGP发言人,彼此称为对方的邻站(neighbor)或对等站(peer)。
-
BGP发言人除了运行BGP外,还必须运行自己所在自治系统所使用的内部网关协议IGP,例如OSPF或RIP
-
BGP发言人交换网络可达性的信息(要到达某个网络所要经过的一系列自治系统)
-
当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的策略从收到的路由信息中找出到达各自治系统的较好的路由。也就是构造出树形结构、不存在回路的自治系统连通图。
BGP-4四种报文:
- OPEN(打开)报文:用来与相邻的另一个BGP发言人建立关系,使通信初始化。
- UPDATE(更新)报文:用来通告某一路由的信息,以及列出要撤销的多条路由。
- KEEPALIVE(保活)报文:用来周期性地证实邻站的连通性。
- NOTIFICATION(通知)报文:用来发送检测到的差错。
IPv4数据报首部格式
IP数据报中每一行为32比特,也就是4字节
- 版本:占4比特,表示IP协议的版本,通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4
- 首部长度:占4比特,表示IP数据报首部的长度。该字段的取值以4字节为单位。最小十进制取值为5,表示IP数据报首部只有20字节固定部分;最大十进制取值为15,表示IP数据报首部包含20字节固定部分和最大40字节可变部分。
- 可选字段(很少使用):长度从1个字节到40个字节不等。用来支持排错、测量及安全等措施。可选字段增加了IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理IP数据报的开销。实际上可选字段很少被使用。
- 填充字段:确保首部长度为4字节的整数倍,使用全0进行填充。
- 区分服务(一般不用):占8比特,用来获得更好的服务。该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。1998年,因特网工程任务组IETF把这个字段改名为区分服务。利用该字段的不同数值可提供不同等级的服务质量。占8比特,用来获得更好的服务。该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。1998年,因特网工程任务组IETF把这个字段改名为区分服务。利用该字段的不同数值可提供不同等级的服务质量。只有在使用区分服务时,该字段才起作用。一般情况下都不使用该字段。
- 总长度:占16比特,表示IP数据报的总长度(首部+数据载荷),最大取值为65535,以字节为单位
标识,标志,片偏移这三个字段共同用于IP数据报分片
-
标识字段:占16比特,属于同一个数据包的各分片数据报应该有相同的标识。IP软件会维持一个计数器,每产生一个数据报,计数器值加1,并将此值赋给标识字段
-
标志字段:占3比特,各比特含义如下
- DF位:1表示不允许分片,0表示允许分片
- MF位:1表示 后面还有分片,0表示这是最后一个分片
- 保留位:必须为0
-
片偏移:占13比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少字节。片偏移以8个字节为单位
- 生存时间TTL字段(防止IP数据报永久兜圈):占8比特,最初以秒为单位,最大生存周期为255秒;路由器转发IP数据报时,将IP数据报首部中的该字段的值减去IP数据报在本路由器上所耗费的时间。若不为0就转发,否则就丢弃。现在以“跳数”为单位,路由器转发IP数据报时,将IP数据报首部中的该字段的值减1,若不为0就转发,否则就丢弃。
- 协议字段:占8比特,指明IPv4数据报的数据部分是何种协议数据单元。
- 首部检验和:占16比特,用来检测首部在传输过程中是否出现差错。比CRC检验码简单,称为因特网检验和。IP数据报每经过一个路由器,路由器都要重新计算首部检验和,因为某些字段(生存时间、标志片偏移等)的取值可能发生变化。
- 源IP地址和目的IP地址:各占32比特,用来填写发送该IP数据报的源主机的IP地址和接收该IP数据报的目的主机的IP地址。
网际控制报文协议ICMP
- 为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP(Internet Control Message Protocol)。
- 主机或路由器使用ICMP来发送差错报告报文和询问报文。ICMP报文被封装在IP数据报中发送。
ICMP差错报告报文:
- 终点不可达:当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达.目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种错误。
- 源点抑制:当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
- 时间超过:当路由器收到一个目的IP地址不是自己的IP数据报,会将其生存时间TTL字段的值减1。若结果不为0,则将该IP数据报转发出去;若结果为0,除丢弃该IP数据报外,还要向源点发送时间超过报文。 另外,当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过报文
- 参数问题:当路由器或目的主机收到IP数据报时,根据其首部的检验和字段发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文
- 改变路由(重定向) :路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。
以下情况不应该发送ICMP差错报告报文:
- 对ICMP差错报告报文不再发送ICMP差错报告报文
- 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文
- 对具有多播地址的数据报都不发送ICMP差错报告报文
- 对具有特殊地址((如127.0.0.0或0.0.0.0)的数据报不发送ICMP 差错报告报文
ICMP询问报文:
- 回送请求和回答:ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达及了解其有关状态。
- 时间戳请求和回答:ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。这种询问报文用来进行时钟同步和测量时间。
ICMP应用举例:
分组网间探测PING(Packet Internet Groper)
- 用来测试主机或路由器的连通性
- 应用层直接使用网际层的ICMP(没用通过运输层的TCP或UDP)
- 使用ICMP回送请求和回答报文
跟踪路由(traceroute):
- 用来测试IP数据报从源主机到达目的主机要经过哪些路由器
- Windows版本下应用层直接使用网际层ICMP,使用了ICMP回送请求报文和回答报文以及差错报告报文
- 通过生存时间字段TTL实现
虚拟专用网VPN(Virtual Private Network)
利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网。由于IPv4地址的紧缺,一个机构能够申请到的IPv4地址数量往往远小于本机构所拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的公有地址。
私有地址只能用于一个机构的内部通信,不能用于和因特网上的主机通信。即只能用作本地地址而不能用作全球地址。因特网中的所有路由器,对目的地址是私有地址的IP数据报一律不进行转发。
从本地网络转发到因特网会对IP数据报做一次加密,然后重新添加首部。如图:
同一机构内不同部门的内部网络所构成的虚拟专用网VPN又称为内联网VPN
有时一个机构的VPN需要有某些外部机构(通常就是合作伙伴)参加进来。这样的VPN就称为外联网VPN。
在外地工作的员工需要访问公司内部的专用网络时,只要在任何地点接入到因特网,运行驻留在员工PC中的VPN软件,在员工的PC和公司的主机之间建立VPN隧道,就可以访问专用网络中的资源。这种VPN称为远程接入VPN
网络地址转换NAT(Network Address Transaction)
NAT能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。以此缓解IPv4地址空间即将耗尽的问题。
由于绝大多数的网络应用都是使用运输层协议TCP或UDP来传送数据,因此可以利用运输层的端口号和IP地址一起进行转换。
这样,用一个全球IP地址就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。这种将端口号和IP地址一起进行转换的技术叫作网络地址与端口号转换NAPT(Network Address and Port Translation)。
使用NAT技术不能由外网主机首先发起通信,因为在收到来自外网的IP数据报后,在NAPT转换表中找不到相应的记录。
运输层
之前的物理层,数据链路层,网络层共同实现了从主机到主机间的通信。但实际上在计算机网络中进行通信的真正实体是位于通信两端主机中的进程。运输层的任务是为运行在不同主机上的应用进程提供直接的通信服务,运输层协议也叫端到端协议
不同操作系统使用的进程标识符各不相同,为了使运行不同操作系统的应用进程间能进行网络通信,就必须使用统一的方法对应用进程进行标识。所以使用端口号来区分一台主机上的不同应用进程
端口号使用16比特标识,从0~65535
主要有两大协议:
- 用户数据报协议UDP(User Datagram Protocol)
- 传输控制协议TCP(Transmission Control Protocol)
UDP是无连接的,通信前无需建立连接,TCP是面向连接的,通信前需要建立连接
UDP支持单播,多播和广播。TCP只支持单播
UDP对应用层交付的报文直接打包,提供不可靠服务。TCP是面向字节流的,提供可靠服务
UDP与TCP首部对比:
TCP协议
TCP基于以字节为单位的滑动窗口实现可靠传输。
-
虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻,发送方的发送窗口并不总是和接收方的接收窗口一样大。
- 网络传送窗口值需要经历一定的时间滞后,并且这个时间还是不确定的。
- 发送方还可能根据网络当时的拥塞情况适当减小自己的发送窗口尺寸。
-
对于不按序到达的数据应如何处理,TCP并无明确规定
- 如果接收方把不按序到达的数据一律丢弃,那么接收窗口的管理将会比较简单,但这样做对网络资源的利用不利,因为发送方会重复传送较多的数据。
- TCP通常对不按序到达的数据是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
-
TCP要求接收方必须有TCP的通信是全双工通信。通信中的每一方都在发送和接收报文段。因此,每一方都有自己的发送窗口和接收窗口。在谈到这些窗口时,一定要弄清楚是哪一方的窗口。机制,这样可以减小传输开销。接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上。
- 接收方不应过分推迟发送确认,否则会导致发送方不必要的超时重传,这反而浪费了网络的资源。
- 捎带确认实际上并不经常发生,因为大多数应用程序很少同时在两个方向上发送数据。
-
TCP的通信是全双工通信。通信中的每一方都在发送和接收报文段。因此,每一方都有自己的发送窗口和接收窗口。在谈到这些窗口时,一定要弄清楚是哪一方的窗口。
注意:接收方能发送的确认报文段只能是按序收到的数据中的最高序号
流量控制
流量控制:让发送方的发送速率不要太快,要让接收方来得及接收。
-
利用滑动窗口机制在TCP连接上实现对发送方的流量控制
- TCP接收方用自己的接收窗户的大小限制发送方发送窗口的大小
- TCP发送方收到接收方的零窗口通知后,应启动持续计时器。持续计时器超时后,向接受方发送零窗口探测报文
拥塞控制
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞(congestion)。在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。
若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
慢开始和拥塞避免算法基本原理:
-
发送方维护一个叫做拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,且动态变化
- 拥塞窗口的cwnd的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大;只要出现网络拥塞,拥塞窗口就减少一些。
- 判断出现网络拥塞的依据:没有按时收到应当到达的确认报文(发生超时重传)
-
发送方将拥塞窗口作为发送窗口swnd,即swnd = cwnd。 发送方发送多少数据取决于拥塞窗口
维护一个慢开始门限ssthresh状态变量:
- 当拥塞窗口 < 发送窗口时,使用慢开始算法
- 当拥塞窗口 > 发送窗口时,改用拥塞避免算法
- 当拥塞窗口 = 发送窗口时,即可使用慢开始也可使用拥塞避免算法
-
发送方的发送窗口同时取决于拥塞窗口和对方的接收窗口,应从接收窗口和拥塞窗口取最小值
慢开始算法:一开始使用慢开始算法,拥塞窗口值为一。且设置慢开始门限值(ssthresh)。若未发生超时重传,则每次拥塞窗口值按指数型增长(乘二)。当拥塞窗口增加至慢开始门限值时改用拥塞避免算法。
拥塞避免:每次拥塞窗口值线性加一。当增加到网络出现拥塞时,更新 慢开始门限值为网络发生拥塞的一半。同时将拥塞窗口重新设为1,再开始慢开始算法。
缺点:有时个别报文段会在网络中丢失,但实际上网络并没有阻塞。这导致发送方的超时重传,并误认为网络发生了拥塞。然后启动慢开始算法,把拥塞窗口值设为1,降低了传输效率。
快重传与快恢复算法:
快重传就是使发送方尽快进行重传,而不是等超时重传计时器超时再重传。
- 要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。
- 发送方一旦收到3个连续的重复确认, 就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传。
- 对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞(进而降低拥塞窗口cwnd为1)。使用快重传可以使整个网络的吞吐量提高约20%。
快恢复算法:
发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段。喻实不启动慢开始算法而执行快恢复算法:
发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半,开始执行拥塞避免算法。
建立连接
若采用“两报文握手”,则TCP服务器接收到连接请求后直接进入连接已建立状态。那么如果有已失效的连接请求报文突然被传送到了TCP服务器,那么TCP服务器接收后直接进入连接已建立状态,同时发生连接确认报文给TCP客户端,但此时TCP客户端处于关闭状态,不会理会这个报文。白白浪费了许多资源
注意:TCP的标准规定,SYN=1的报文段不能携带数据,但要消耗掉一个序号。普通的确认报文段如果不携带数据,则不消耗序号。
连接释放
前2次挥手后TCP连接处于半关闭的状态,从客户端到服务器的连接被关闭,但服务器还可以向客户端发送数据。在服务器发送完数据后,向客户端发送连接释放报文并进入最后确认状态,在收到客户端的TCP确认后关闭
那为什么客户端还要进入时间等待状态不直接关闭呢? :有可能客户端发送的最后的确认报文段在网络中丢失了。那么服务器收不到确认就会一直超时重传,这时候客户端已经关闭了没法回应,导致服务器一直处于最后确认状态无法关闭。
报文段首部格式
源端口:占16比特,写入源端口号。用来标识发送该TCP报文段的应用进程
目的端口:占16比特,写入目的端口号,用来标识接收该TCP报文段的应用进程
序号:占32比特,序号增加到最后一个后,下一个序号又从0开始,指出本TCP报文段数据载荷的第一个字节的序号。
确认号:占32比特,序号增加到最后一个后,下一个序号又从0开始。指出期望收到的下一个TCP报文段数据载荷的第一个字节的序号,同时也表明对之前收到的数据的确认。(例:确认号为n,表示到序号n-1为止的所有数据都正确接收,期望接收数据为n的数据)
注意:只有当确认标志位ACK为1是确认号字段才有效,取值为0确认号字段无效,TCP规定在连接建立后所有传送的TCP报文段都必须把ACK置为1.
数据偏移:占4比特(以4字节为单位计算)。用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远。 ,实际上就是标明首部长度。
窗口:占16比特,以字节为单位。指出发送方的接收窗口,窗口值作为接收方让发送方设置其发送窗户的依据。以接收方的接收能力控制发送方的发送能力(流量控制)
校验和:占16比特,检查范围包括TCP报文段的首部和数据载荷两部分。
同步标志位SYN:在TCP连接建立时用来同步序号
终止标志位FIN: 用来释放TCP连接
复位标志位RST:用来复位TCP连接。当RST=1时,表明TCP连接出现了异常,必须释放连接再重新建立连接。可以用来拒绝TCP连接
推送标志位PSH:接收方收到PSH=1的报文段后会尽快上交应用进程,而不用等到接收缓存满后再向上交付
紧急标志位URG:取1时紧急指针字段有效,取0则无效。用来表明紧急指针字段是否有效
紧急指针:当发送方有紧急数据时,可将紧急数据插队到发送缓存的最前面,并立刻封装到一个TCP报文段中进行紧急发送。紧急指针指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后的shi普通数据。
应用层
网络应用程序在各种端系统上的组织方式主要由两种:
- 客户/服务器(Client/Server,C/S)方式
- 对等(Peer-to-Peer,P2P)方式
动态主机配置协议DHCP
网络中各主机可以靠DHCP自动获取网络配置信息而不用手动配置
DHCP使用UDP协议 ,部署在服务器上为客户端提供服务。工作过程:
-
客户主机发送DHCP发现报文(内含事务ID,客户端MAC地址等),源ip地址为0.0.0.0(因为还未分配IP地址),目的IP地址为255.255.255.255(广播地址,因为客户端不知道网络中DHCP的服务器IP地址)
-
DHCP服务器接收后发送DHCP提供报文(包含可以提供给客户端的IP地址等配置信息),源IP地址为DHCP服务器地址,目的IP地址仍为广播地址255.255.255.255
-
客户端解析DHCP提供报文,若该报文的事务ID与自己发送的DHCP发现报文的事务ID一致。表明这是自己请求的报文。否则丢弃该报文。
-
接收DHCP提供报文后,发送DHCP请求报文(含有事务ID,客户端的MAC地址和之前接收的DHCP提供报文中的配置信息等),源IP地址为0.0.0.0,目的地址还是广播地址255.255.255.255(不用向每一个DHCP服务器都发送DHCP请求报文)
-
DHCP服务器接收DHCP请求报文后,向客户端发送DHCP确认报文,源IP地址为DHCP服务器IP地址,目的IP地址为广播地址255.255.255.255。
-
客户端收到DHCP确认报文后,就可以使用DHCP分配的IP地址了。但在此之前,会使用ARP检测分配的IP!地址是否已经被占用。
- 若被占用,则给DHCP服务器发送DHCP撤销报文撤销IP!地址租约,并重新发送DHCP发现报文
- 未被占用就可以使用IP地址进行通信了
-
在租用期过了一半后,客户端需要向DHCP服务器发送DHCP请求报文申请延长租用期。DHCP可随时向客户端发送DHCP释放报文终止租期,客户端必须立即停用租用的IP地址
DHCP中继代理:路由器收到广播的DHCP发现报文是不会转发的,DHCP服务器就收不到该报文。可以给路由器配置DHCP服务器的IP地址使之成为DHCP中继代理。路由器收到DHCP发现报文后就会单播转发给DHCP服务器。且这样不必每一个网络都配置DHCP服务器
域名系统DNS(Domain Name System)
因特网采用层次树结构的域名结构
-
域名结构由若干分量组成,各分量之间用”点“隔开,代表不同级别的域名
- 级别从右往左降低,各级域名由其上一级域名管理机构管理,可以自行确定
DNS服务器使用分布正在各地的域名服务器实现域名到IP的转换,有四种类型:
- 根域名服务器:根域名服务器通常不直接对域名进行解析,而返回该域名所属的顶级域名的顶级域名服务器的IP地址
- 顶级域名服务器:这些域名服务器负责管理在该顶级域名下注册的所有二级域名
- 权限域名服务器:负责管理某个区的域名。
- 本地域名服务器:本地域名服务器起着代理的作用,一个主机发出的DNS请求报文会首先送到该主机的本地域名服务器。然后将其转发。它又是也称为默认域名服务器
域名解析
- 递归查询:主机发送的DNS请求报文层层向上转发,再层层返回给主机
- 迭代查询:主机按顺序逐个向上发送请求报文
递归查询对于被查询的域名服务器负担太大,通常从请求主机到本地域名服务器是递归查询,其余的是迭代查询
为了提高DNS的查询效率,并减轻根域名服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛地使用了高速缓存。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
由于域名到IP地址的映射关系并不是永久不变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并删除超过合理时间的项(例如,每个项目只存放两天)。
文件传输协议FTP
文件传送协议FTP(File Transfer Protocol)是互联网使用最广泛的文件传送协议。
- FTP提供交互式的访问,允许客户指明文件的类型与格式(如指明是否使用ASCII码),并允许文件具有存取权限(如访问文件的用户必须经过授权,并输入有效的口令)。
- FTP屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传送文件。
FTP基本工作原理
-
主动模式:
- FTP客户端会随机选择一个临时端口号。与FTP客户端的熟知端口号21建立TCP连接,这条通道用来传输控制命令,作为命令通道
- 当有数据要传输时,FTP客户通过命令通道告知FTP服务器与自己的另一个临时端口号建立TCP连接,作为数据通道。
注意:控制连接在整个会话期间一直保持打开,数据连接只有在每次文件传输时才建立,传输结束就关闭
- 被动模式:
不同之处在于当有数据要传输时,FTP客户通过命令通道告知FTP!服务器开启某个临时端口被动等待TCP连接,建立数据通道