这个系列主要是将前端有关的计算机基础相关知识做一下总结,完善我们的知识体系,本系列分为以下部分(点击链接可直接查看)
数据结构和算法等2021年中会发布。
概述
计算机网络就是一些互连、自治的计算机系统的集合,主要讲的是怎么使不同的计算机互相通信。
为了将复杂的通信系统的不同功能解耦,需要对整个过程中需要的功能进行模块化处理;为了使各个模块可复用,因此需要对各个模块建立统一的标准。
在这里不同的模块就是计算机网络的分层,标准化就是通信中涉及到的不同协议。在介绍具体内容之前我们先了解几个概念。
- 协议 是两个同层模块通信的规则合集
- 接口 相邻两层模块间的连接点
- 服务 下层为上层提供的功能
常见的分层模型包括osi参考模型、tcp/ip模型及对应的协议如下(参考)
注意各层之间的实现细节是无感知的,各层之间只需要使用其它层提供的服务接口,完成自己的任务并对外提供服务。除此以外的可以不关心。
osi参考模型是国际标准化组织(ISO)提出的,分为应用层、表示层、会话层、传输层、网络层、数据链路层和物理层七层。具体实现比较低效。该模型过于理想化,目前实现起来比较困难且低效。
tcp/ip模型是ARPA对已有协议的描述,因此成为事实上的标准,分为应用层、传输层、网际层、链路层四层。 其中链路层描述过于泛泛。
由于两者都存在一定问题,于是产生了我们目前接触最多的改进版五层tcp/ip模型(以下涉及到的图多来自microchipdeveloper)。
五层模型各层功能
- 应用层 是需要通信的应用程序(比如web浏览器)所在的地方,这些应用使用传输层发送请求远程连接host
- 传输层 使用tcp的可靠连接和udp的快速连接为不同hosts上的应用建立连接。可以通过端口号来跟踪应用上运行的进程。使用网络层访问network
- 网络层 负责创建跨网络的packets,使用ip地址确定一个packet的源和目的地址
- 数据链路层 负责创建跨网络的frames,这些frames封装了packets,并使用MAC地址确定源和目的地址
- 物理层 负责编解码并传输frame中的比特流
在整个过程中,高层向低层传递信息,每层都会添加一个header,header中包含着改成所需要的信息,这个过程从应用层开始,我们以访问一个web页面为例:
- 应用层 应用层生产一个message,即请求浏览器发起一个下载web页面的请求,这个消息随后被发往传输层。
- 传输层 添加tcp或udp的hader,包含数据源和目的地址的端口地址。另外的信息比如tcp使用的packet 序列号也会添加到header。如果使用的是tcp,则会生成一个Segment,如果使用的udp,则生成Datagram,然后被发往网络层。
- 网络层 添加了包含源和目的的ip地址的header,生成一个packet,然后发往数据链路层
- 数据链路层 添加包含当前和下一跳mac地址的header,生成一个frame,发往物理层传输bit
应用层
包含各种应用程序直接使用的协议,用户可以使用对应应用程序提供的软件发送信息。常见协议包括
DHCP
当客户端检测有网络时会自动向服务器请求一个ip,服务器一般运行在路由器中
DNS
可以通过域名获取ip。一个网络需要ip(不能是domain或host)才能生成一个packet
HTTP
是最常见的协议,下一篇文章会详细讨论,
NBNS
表示netBios name service,用来将一个本地的host name转换成本地ip,类似于DNS。
SMTP
用来发送邮件
Telnet
用来使用终端进行 bi-directional text communication
传输层
从应用层获取数据,然后会将每个运行的进程添加一个端口号,并在获取的数据上添加tcp或udp header。
只有主机才有传输层和应用层,比如路由器只有下面三层。
功能如下
- 提供进程之间的通信,即端到端的通信(对应的网络层提供的主机之间的通信点到点)
- 复用和分用,是对应用层而言的,发送方的传输层不管什么应用的数据都会统一传到下一层,这就是复用;接收方的传输层再剥去报文头部后将信息发到各个进程
- 对报文(首部和数据)进行差错检测(ip只检测ip首部)
- 提供tcp和udp两种协议
注意ip传输是不可靠的,如果当前层使用tcp可以保证通信可靠,udp则不可以
寻址
端口号
传输层使用端口号对应每个进程,作用相当于网络层的ip地址和链路层的mac地址。端口号长度16bit,包含65536(即2^16)个不同的端口号。端口号分两种
- 服务端使用的端口号,又分为两种
- 0到1023,被指定为重要的应用程序,比如
- 1024到49151,被其他服务端使用
- 0到1023,被指定为重要的应用程序,比如
- 客户端使用的端口号,仅在客户端运行时动态选择,又被称为临时端口
套接字
在网络通信中使用一个套接字(socket)标记一个通信端点,套接字等于"ip+端口号"
UDP协议
User Datagram Protocol (UDP) 只在ip数据报的基础上增加了两个功能:复用分用以及差错检查。
有以下优点
- 无需建立连接,不可靠但速度快
- 可以实现广播或多播
- 无连接状态需要维护,不会阻塞
- 头部开销小,8B(tcp需要20B)
UDP的处理单位是报文,对从上层获取的报文即不合并也不拆分,只处理udp首部即传到下一层。
关于分片这里补充一下,链路层对于数据帧有个长度限制,即MTU(Maximum Transmission Unit,MTU),如果网络层的数据大于这个限制需要分片后传到链路层,比如这里的udp数据。而使用tcp时,tcp中有个MSS(Maxitum Segment Size)的限制,一般MSS小于MTU,因此tcp切片后就不需要ip层切片。
报文格式如下
分别表示
- source port 源端口
- destination port 目的端口
- length udp数据报总长度,最短是报头的8B
- header and data checksun 校验和,用来校验数据报是否有错
TCP协议
Transfer Control Protocol (TCP)可以提供可靠传输、流量控制和拥塞控制,有以下特点
- 面向连接,可靠但速度慢
- 只能一对一通信
- 提供全双工通信 tcp报文的首部最短有20B,包括(图源):
分别表示
- Source Port 源端口
- Destination Port 目的端口
- Sequence Number(连接管理中用seq表示) 序列号,本报文发送的第一个字节的序号
- Acknowledgment Number(连接管理中用ack表示) 确认号,期待下一次收到的第一个字节的序号
- Data Offset 首部长度
- Reserved 保留字段,未来使用
- flags 各种标志位,0或1,其中URG是否紧急、ACK建立连接时表示确认、PSH(push)尽快交给应用程序而不用等缓存填满、RST(reset)重新建立连接、SYN在连接时表示连接请求、FIN(finish)断开连接时用于断开请求
- Window 允许对方发送的数据量
- Checksum 校验和
- Urgent Pointer 和URG 一起使用表示紧急数据是前多少字节
- Options 目前只有一个就是用于分片的MSS】
- Padding 填充字段,使整个首部是4B的倍数
连接管理
tcp是面向连接的协议,每个连接包含建立连接、数据传送和释放连接三个阶段
连接过程包含三个步骤,即三次握手,其中主动发起的叫客户端
- 客户端发送请求报文,SYN置为1,带有一个随机序列号seq=x,不携带数据,但是消耗一个序列号
- 服务端接收到请求报文,如同意建立连接则进行必要设置后发送确认报文,SYN和ACK都设为1,随机序列号seq=y,确认号为请求报文的序列号+1,即ack=x+1,不携带数据,但要消耗一个序列号
- 客户端接到确认报文后,进行必要设置,向服务端确认,ACK为1,seq=x+1,ack=y+1,可以携带数据,如果不携带不消耗序列号
建立连接的是全双工通信,双方在任何时候都能发送数据,另外双方分配资源是在第二次和第三次握手,因此服务器容易遭受SYN泛洪攻击,即客户端发起第一次握手后就消失,服务端就会不断发起第二次握手,消耗服务端的资源。
建立连接时的序列号要随机而不能相同,从而每次都能创建新的连接。
三次握手为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误
连接释放
参与连接的任何一方都可以终止连接,分为四个步骤,即四次挥手
- 客户端打算关闭连接时发送一个释放请求报文,FIN设为1,seq为已传送数据最后一个字节序号+1(假设是u).消耗一个序列号,并终止发送数据,关闭tcp连接中的发送功能,此时还能接收
- 服务端收到释放请求报文,发出确认报文,ACK为1,ack=u+1,seq参考上面,为v。此时单向连接已关闭 此时服务端可以继续发送数据,直到发送完毕,然后发起另一个方向连接的请求
- 将FIN设为1,ACK设为1,seq为实际算出的,如果二次挥手后无数据发送则为v+1,这里记为w,ack=u+1,发送释放请求报文
- 发出确认报文,ACK为1,seq=u+1,ack=w+1,等2msl(Maximum Segment Lifetime,表示任何报文在网络上存在的最长时间)后关闭。
第四次挥手等待2sml是为了保证服务端接收到确认报文,因为如果没接收到,服务端会在超时后再次发起第三次挥手。
网络层
当发送数据时,本层会添加包含源ip和目的ip的头部,然后发送到数据链路层。
当接收数据时,对于host,如果接收的数据目的ip是本机地址,则发送到传输层.对于路由器,会根据ip进行路由选择发送给目标host或者路由器,具体的转发要通过arp协议获取对应mac地址。
功能
网络层的功能包括异构网络互联、路由与转发、拥塞控制。
网络互联
网络层和下面的数据链路层、物理层负责上层数据的实际通信。其中网络层负责在多个网络(可根据子网掩码确认是否在一个网络)的交换,数据链路层负责在一个网络内部的数据交换,物理层负责实际的bit流传输。
在整个网络包含很多中间设备
- 物理层:中继器(Repeaters),集线器(Hubs) 用来延长信号传播距离
- 数据链路层:网桥(Bridge),交换机(Switch) 用来连接同一个网络的host
- 网络层:路由器(Router) 连接不同网络,其中wan和lan分别代表广域网和局域网,在数据链路层会详细介绍
- 网络层以上:网关(Gateway)关于网关、代理、隧道等术语参考 Hypertext Transfer Protocol
路由与转发
分别是
- 路由选择 根据特定的路由选择协议构造出路由表,并更新和维护
- 分组转发 转发表查询,转发数据流
拥塞控制
因过量分组引起网络性能下降的现象称为拥塞,控制方法分为预防性的开环控制和动态的闭环控制
IPV4
就是当前普遍使用的ip版本
packet
ip传输的基本单位是packet,header格式为以下,我们主要关注一下用ip表示的源地址和目的地址
因为数据链路层有最大传送单元(MTU)的限制,因此IP的packet需要分片保证低于这个限制
IPv4地址
ip地址是一个32位的全球唯一标识,分为ABCDE五类,每个ip地址分为主机号和网络号两部分,网络号标记所在的网络,主机号是表示该网络中的唯一标识。
NAT
Network address translation (NAT)将内部网络地址转换为公网地址,方便内部管理和解决了ip不足的问题。
为了网络安全,一部分ip地址被划分为私有ip地址,只能用于lan,包括
子网划分与子网掩码、CIDR
两级IP地址会使ip地址的利用率低且不灵活,于是又推出了子网号字段,这种做法被称为子网划分,于是一个ip分为网络号、子网号、主机号三部分。
为了表示子网是怎么划分的,需要借助子网掩码,我们可以知道三级ip的情况网络是怎么划分的。
子网掩码是一个与ip一样长度的二进制,是由一串1和跟随的0组成,其中1对应网络号和子网号,0代表主机号,将一个ip对齐对应子网掩码的每一位分别进行与操作便得出相应子网的网络地址,比如
- ip 192.168.5.56
- 子网掩码 255.255.255.0
- 网络地址 192.168.5.0
Classless inter-domain routing (CIDR)在ABC类划分的基础上进一步对网络进行划分,这种划分将ip分为两部分网络前缀和主机号,使用cidr标记来表示,即ip地址/网络前缀所占bit数,其中网络前缀相当于网络号,如一个cidr标记所表示的ip数,以及起始ip为
ARP,DHCP,ICMP
mac地址是数据链路层的概念,表示物理地址,下一节会详细介绍
当路由器收到数据包时会根据目的ip得出转发的下一个路由器或主机的ip,具体转发要根据mac地址进行实现,每次转发时源ip和目的ip不变,但是源mac和目的mac会随实际转发的源和目的进行变化。从ip地址到mac地址的转换即使用的 Address Resolution Protocol (ARP)协议。
Dynamic Host Configuration Protocol (DHCP)用于路由器动态生成一个子网内的ip地址
Internet Control Message Protocol (ICMP) 可以被主机或路由器用来报告差错和异常,对应的两个应用是ping和traceroute,分别用来验证两台主机连通性和跟踪分组经过的路由。
IPV6
是IP的最新版本,解决了ip地址耗尽和IPV4存在的其他问题,具体可参考ipv6
数据链路层
数据链路层用于在单个网络内部的设备中传输信息。
当发送数据时,将包含源和目标mac地址的header封装到从网络层接收到的数据包中,创建frame发送到物理层。
当接收数据时,对于主机,如果数据中包含本机的mac地址则传到网络层进一步处理;
对于中继设备(比如网桥和交换机),这些设备的每个端口都是一个碰撞域(冲突域,也叫网段,每个碰撞域中的主机用线或者物理层中继设备连接),一个碰撞域可以由多个设备相连,它们可以直接通信而不需要借助数据链路层设备转发。因此如果接收到的源mac和目的mac在同一个碰撞域,则直接丢弃(因为它们可以直接通信),否则转发到目标碰撞域(中继设备的另一个端口)。
功能
为网络层提供的服务分三种
- 无确认的无连接服务
- 有确认的无连接服务
- 有确认的面向连接服务
链路管理
对其中面向连接的服务管理链路的建立、连接和释放
组帧
当接收到网络层的数据后,会按照一定规则对其封装成帧,解决帧定界、帧同步和透明传输等问题。
组帧过程中会将收到的数据分别添加首部和尾部,可以用来帧定界,帧同步(表明帧的起始和结尾)。
在数据中可能会产生和帧边界相同的bit组合,组帧过程中要保证不管有什么bit组合都能在链路层传输,这就是透明传输的问题
流量控制
解决收发双方速度不一致问题
差错控制
由于信道噪声等问题,帧在传输过程中可能会出错,包括位错和帧错。
位错是某些位发生错误,就需要通过自动重发出错的帧。
帧错是帧的丢失、重复或失序,数据链路层引入定时器和编号机制,保证正确传输。
介质访问控制
解决的是当信道发生竞争时的处理方案。IEEE802系列标准把数据链路层分成LLC(Logical Link Control,逻辑链路控制)和MAC(Media Access Control,介质访问控制)两个子层(图源),其中MAC子层负责介质访问控制。
当多个设备共享一个信道时,有以下处理方式
信道划分
通过信道划分可以把原来的一条信道分为几条互不干扰的子信道,相关方法包括
- 频分多路FDM
- 时分多路TDM
- 波分多路WDM
- 码分多路CDM,比如CDMA是具体的一种,即码分多址
随机访问
不采用对信道的集中控制,而是采用随机的发送信息,当有多个用户同时发送时会都失败,然后按照一定规则反复重发,直到无碰撞通过,相关规则包括
- ALOHA
- CSMA
- CSMA/CD
- CSMA/CA
轮循访问介质访问控制
在这种控制方法中,用户不能随机,要以循环得方式分配各个节点通信权,当信道被占用时其他节点不能发送消息,比如令牌传递(token passing)协议
局域网
局域网( local area network,LAN)是一个较小地理范围的一个计算机网络,由拓扑结构、传输介质和介质访问控制方式三个要素决定一个局域网的技术特性。 常见的局域网拓扑有四大类
- 星形
- 环形
- 总线形
- 星形和总线形结合
传输介质包括双绞线、铜线和光纤等多种,主要是双绞线 戒指访问控制方法主要有CSMA/CD、令牌总线和令牌环,其中前两种用于总线性,后一种用于环形
三种特殊的局域网拓扑为
- 以太网,逻辑拓扑总线型,物理拓扑星形或扩展星形
- 令牌环(IEEE802.5),逻辑环形,物理星形
- FDDI(IEEE802.8),逻辑环形,物理双环
IEEE802定义了局域网对于osi参考模型数据链路层和物理层,并将数据链路层分为两个子层,llc和mac。
由于以太网在市场上的垄断地位,以太网常用来表示局域网,其中llc层在以太网用处不大,因此很多网卡只有mac层。
以太网和IEEE802.3
以太网和iEEE802.3的标准有很小的差异,因此IEEE802.3局域网可以称为以太网。其逻辑上使用总线拓扑结构、所有计算机共享一条总线,信息以广播方式发送,采用CSMA/CD方式介质控制
IEEE802.11
是无线局域网协议
IEEE802.5
即令牌环网
广域网
广域网(Wide area network,wan)是范围很广的长距离网络,是因特网的核心部分.和局域网的区别如下
物理层
用网线或者无线传输frame中的bit流,本层的中继设备(中继器和集线器)只用来延长线路。
基本概念
这里补充一些通信相关的概念
- 数据 是传送信息的实体,分为数字数据和模拟数据,在存储过程中用二进制表示
- 信号 数据在传送过程中的形式,分为模拟信号和数字信号
- 信源、信道和信宿 分表表示数据的产生、运送和接收方
- 编码 数据为了传输要转变成信号,变成模拟信号叫调制、数字信号叫编码
- 电路交换、报文交换和分组交换 数据传输的三种方式
传输介质
分为有线和无线,其他见数据链路层相关介绍
本期完结撒花