前言
本文只用于顽固和复习(预习)计算机网络基础内容,不具备原创性。
网络
网络协议
计算机网络中的数据交换必须遵守实现约定好的规则,所有的通信过程都必须遵守默写规则,这里的规则就是协议
网络协议规定了通信实体之间所交换的信息格式、意义、顺序以及针对收到信息或者发生的时间所采取的动作。
三要素
- 语法:数据与控制信息的结构或格式
- 语义:需要发出何种控制信息,完成何种动作,做出何种回应
- 时序:事件的顺序,速度匹配
协议规定了网络中所有信息发送和接收的过程,例如TCP、IP、HTTP等
局域网和广域网
广域网(WAN)是由具备通信能力的设备相互连接而形成的。它有着十分广阔的地理覆盖范围,可以覆盖一个城市、一个省、一个国家甚至全世界都可以。而局域网则只能覆盖一间办公室、一栋大楼或者一个校园。
局域网互联主机
广域网互联交换机、路由器、调制解调器(是调制器和解调器的缩写,一种硬件,能够把计算机的数字信号翻译成可沿普通电话线传送的模拟信号,而这些模拟信号又可被线路另一端的另一个调制解调器接收,并译城计算机可懂的语言,完成两台计算机之间的通信)等连接设备。
局域网通常由使用它的组织拥有
广域网通常由通信公司建设和运营
目前有两种典型的广域网:点到点广域网和交换式广域网
网络层次结构(OSI)
| OSI七层模型 |
|---|
| 应用层 |
| 表示层 |
| 会话层 |
| 传输层 |
| 网络层 |
| 数据链路层 |
| 物理层 |

各层功能
应用层
简单来说就是应用程序。应用层负责确定通信对象,并确保有足够的资源用于通信。一般为操作系统或者网络应用程序提供访问网络服务的接口。
同时两个应用层之间得逻辑链接是端到端得,其通信处于两个进程之间。应用层交换得数据成为消息(message),常见的协议有http、ssh、smtp、ftp等
ps:记事本因为不产生流量,所以不属于应用层。基本上属于应用层的都是那些会产生流量的应用。
表示层
负责数据的编码、转化,确保应用层的正常工作。
这一层主要是将人肉眼可见的界面与二进制互相转化的地方,直白地说就是将人类的语言转化为机器语言。
数据的压缩解压和加解密都在这一层完成,它会根据应用的不同目的将数据处理为不同的格式(txt、word、markdown等)
会话层
负责建立、维护、控制绘画,区分不同的会话,以及提供单工、半双工、全双工三种通信模式的服务。(实际上就是三大功能——建立会话、保持会话、断开会话
- 建立会话:A、B两台网络设备之间要通信,要建立一条会话供他们使用,在建立会话的过程中也会有身份验证,权限鉴定等环节
- 保持会话:通信会话建立后,通信双方开始传递数据,当数据传递完成后,OSI会话层不一定会立刻将两者这条通信会话断开,它会根据应用程序和应用层的设置对该会话进行维护,在会话维持期间两者可以随时使用这条会话传输局
- 断开会话:当应用程序或应用层规定的超时时间到期后,OSI会话层才会释放这条会话。或者A、B重启、关机、手动执行断开连接的操作时,OSI会话层也会将A、B之间的会话断开
会话层利用在数据中插入校验点来实现数据的同步。
可以说会话层是最薄的一层
传输层
传输层负责分割、组合数据,实现端到端的逻辑连接。上面三层的数据来到这一层就会被分割,分割后的数据叫做段
三次握手、面向连接或非面向连接的服务、流控都发生在这一层。
传输层还要处理端到端的差错控制和流量控制问题
总结的话就是传输层主要是搞可靠传输、不可靠传输以及流量控制的。
1 | TCP:传输层的服务可以i提供一条无差错按顺序的端到端链接, |
网络层
负责管理网络地址,定位设备,决定路由。IP地址和路由器都是在这一层工作,传输层的数据段来到这一层就会被分割,封装后叫作包。(经常说的抓包就是抓这一层的数据)
包有两种,一种是用户数据包,这是上层传下来的用户数据。另一种是路由更新包
,顾名思义是路由器发出来的数据包,用于跟其他路由器进行路由器信息的交换,负责对子网间的数据包进行路由器选择。
网络层还可以实现拥塞控制、网际互连等功能。
一句话总结:网络层负责选择最佳路径和选择IP地址编址。
数据链路层
数据链路层负责准备物理传输,CRC校验,错误通知,网络拓扑,流控等。
MAC地址和交换机都工作在这一层。
网络层传下来的包在这一层会被分割然后封装,叫做帧。
数据链路层在不可靠的物理介质上提供可靠的传输,作用如下:
- 物理地址寻址
- 数据的成帧
- 流量控制
- 数据的检错
- 重发
- etc
数据链路层主要解决几个基本问题
- 封装成帧
- 透明传输
- 差错控制
PS:这一层的帧跟动漫里面的帧不是同一个帧,应该不会有人跟以前的我一样傻逼的以为这两个是同一个玩意吧
一句话总结的话就是数据链路层规定数据如何封装,添加物理层地址(MAC地址)。
物理层
物理链路,负责将数据以比特流的方式发送、接收
主要就是规定电压、接口标准。
各层经典设备
| 层 | 设备 |
|---|---|
| 应用层 | 计算机:应用程序(FTP、SMTP、HTTP)【应用代理型防火墙】 |
| 表示层 | 计算机:编码方式、图像编解码、URL字段传输编码 |
| 会话层 | 计算机:建立会话、SESSION认证、断点续传 |
| 传输层 | 计算机:进程和端口 |
| 网络层 | 网络:路由器、防火墙(包过滤型)、多层交换机 |
| 数据链路层 | 网络:网卡、网桥、交换机 |
| 物理层 | 网络:中继器、集线器、网线、HUB |
各层常见协议
| 层 | 协议 |
|---|---|
| 应用层 | HTTP,TFTP,SNMP,FTP,SMTP,DNS,Telnet(文件传输,电子邮件,文件服务,虚拟终端) |
| 表示层 | 没有协议(实际上就只是数据格式化、代码转换、数据加密) |
| 会话层 | 没有协议 |
| 传输层 | TCP、UDP(提供端与端的接口) |
| 网络层 | IP、ICMP、IGMP、RIP、OSPF、BGP(数据包选择路由) |
| 数据链路层 | ARP、RARP(传输有地址的帧以及错误检测功能) |
| 物理层 | ISO2110,IEEE802,IEEE802.2(以二进制数据形式在物理媒体上传输数据) |
TCP/IP协议
TCP报文
TCP报文时TCP层传输的数据单元,也叫报文段

端口号:永来标识同一台计算机的不同的应用进程
源端口:源端口和IP地址的作用是标识报文的返回地址
目的端口:端口指明接收方计算机上的应用程序接口
序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。
1
一个报文段的序号为300,此报文段的数据部分共有100字节,则下一个报文段的序号为400(300+100)
数据偏移/首部长度:由于首部可能含有可选内容,因此TCP报头的长度是不确定的,包头不包含任何人选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为十进制为15,所以包头最大长度为60字节。首部长度实际上指示了数据区在半文端的起始偏移值,所以首部长度也叫数据偏移。
保留:一般置0
控制位:URG、ACK、PSH、RST、SYN、FIN(每一个标志为表示一个控制功能)
标志 功能 URG 紧急指针标志,为1时表示紧急指针有效,0时则忽略紧急指针【和紧急指针配合使用,发送紧急数据】 ACK 确认序号标志,1时表示确认好有效,0时表示报文中不含确认信息,忽略确认号字段【确认号是否有效】 PSH push标志,1时表示带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队【简单地说就是指示发送方和接收方将数据不做缓存,立刻发送或接收】 RST 充值连接标志,用于重置由于主机崩溃或者其他原因而出现错误的连接,或用于拒绝非法的报文段和拒绝连接请求【由于不可恢复的错误重置连接】 SYN 用于连接建立指示 FIN 用于连接释放指示 窗口大小:用于基于可变滑动窗口的流控,指示发送方从确认号开始可以再发送窗口大小的字节流
检验和:为增加可靠性,对TCP头、数据和伪头计算检验和
选项字段:长度可变,TCP最初只规定了一种选项,即最大报文段长度MSS,MSS告诉对方TCP自己缓存所能接收的报文段的数据文段的最大长度是MSS个字节。
三次握手和四次挥手
三次握手
第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=n,并将该数据包发送给服务端。客户端进入SYN_SENT状态,等待服务端确认。
第二次握手:服务端收到数据包后由标志位SYN=1直到客户端请求建立连接,服务端将标志位SYN和ACK都置为1,ack=n+1,随机产生一个值seq=k,并将该数据包发送给客户端以确认连接请求,服务端进入SYN_RCND状态
第三次握手:客户端收到确认后,检查ack是否为n+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=n+1,并将该数据包发送给服务端。服务端检查ack是否为k+1,ACK是否为1,如果是就连接建立成功,客户端和服务端进入ESTABLISHED状态,完成三次握手,然后就开始传输数据。
四次挥手
第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态
第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),客户端进入CLOSE_WAIT状态,此时TCP连接处于半关闭状态(客户端已经没有数据传输了,但是服务端若发送数据,则客户端仍要接收)
第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传输,服务端进去LAST_ACK状态
第四次挥手:客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务端,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。
1 | Q:为什么在TCP协议里,建立连接是三次握手,而关闭连接却是四次握手呢? |
TCP协议如何来保护传输的可靠性
TCP提供一种面向连接的、可靠的字节流服务。其中,面向连接意味着两个TCP的应用在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信,而字节流服务意味着两个应用程序通过TCP链接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。
- 数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据
- 对失序数据包重排序:TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层
- 丢弃重复数据:对于重复数据,能够丢弃重复数据
- 应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认,但是这个确认会有延迟(几分之一秒)。
- 超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段
- 流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议
流量控制
流量控制主要通过滑动窗口机制实现
滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口。同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。
发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送却还没有被确认的帧,或者是那些可以被发送的帧
滑动窗口
TCP的滑动窗口主要有两个作用,一是提供TCP的可靠性,二是提供TCP的流控特性
TCP是全双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。其中各自的“接收窗口”大小取决于应用、系统、硬件的限制,但是tcp的传输速率不能大于应用的数据处理能力,否则就会缓冲区淹没。各自的“发送窗口”则取决于对端通告的“接收窗口”,也就是取决于接收的缓冲区的大小
发送窗口只有在收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界
接收窗口只有在前面的所有数据确认收到的情况下,才会移动左边的窗口。当前面还有未接受的字节,而后面的字节已接收的情况下,窗口也不会移动,也不会对后续的字节进行确认。一次确保对端会对这些未收到的数据进行重传
一句话概括:最基本的传输可靠性来源于确认重传机制
滑动窗口协议
- 等停协议(stop-and-wait):这时接受方的窗口和发送方的窗口大小都是1个比特,所以也叫1比特滑动窗口协议。发送方这时自然发送(每次只能发送一个,并且必须等待这个数据包的ACK,才能发送下一个)。虽然在效率上比较低,带宽利用率明显较低
- 后退n帧协议:这也是滑动窗口协议真正的用处,这里发送的窗口大小为n,接受方的窗口仍然为1。假设n=9:
首先发送方一口气发送10个数据帧,前面两个帧正确返回了,数据帧2出现了错误,这时发送方被迫重新发送2-8这7个帧,接受方也必须丢弃之前接受的3-8这几个帧。
后退n协议的好处无疑是提高了效率,但是一旦网络情况糟糕,则会导致大量数据重发,反而不如上面的停等协议, - 选择重传:后退n协议的另外一个问题是,当有错误帧出现后,总是要重发该帧之后的所有帧,毫无疑问在网络不是很好的情况下会进一步恶化网络状况,重传协议便是用来解决这个问题。原理很简单,接收端总会缓存所有收到的帧,当某个帧出现错误时,只会要求重传这一个帧,只有当某个序号后的所有帧都正确收到后,才会一起提交给高层应用。重传协议的缺点在于接受端需要更多的缓存
拥塞控制
拥塞控制是一种分布式的用于实现多个竞争数据流共享网络资源的算法。其中拥塞则被定义为由于网络资源过载,从而导致网络用户侧观测到的概率性丢包以及时延的状态,而网络资源过载导致了网络的空间以及时间复用的效用降低。
其中拥塞控制包括了慢启动、拥塞避免、快速重传以及快速恢复
慢启动
该算法的思想主要是一种探测一下网路的拥塞程度,就是不要一开始就发送大量的数据,也就是说有小到大逐渐增加(指数)拥塞窗口的大小。
拥塞避免
如果按慢启动的思想,不加以控制的话,毫无疑问会发生网络拥塞,当cwnd(拥塞窗口)很快增长上来的时候,它很快利用了网络的资源,但是cwnd不能一直这样增长,一定需要某个限制
TCP使用了一个慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动结束,进入拥塞避免阶段。对于大多数的TCP是吸纳来说,ssthresh的值是65535(同样以16bit来计算)。
拥塞避免的思想就是转指数增大变为加法线性增大。这样就可以避免增长过快导致网路拥塞,慢慢的增加调整到网络的最佳值。
快速重传
RTO(恢复时间目标)超时重传会导致TCP传输效率较低。目前Linux TCP实现是采用ACK或者SACK的机制来实现对数据包进行累积确认,预测数据包丢失,实现快速重传
快速重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置重传计时器时间到期
快恢复
快速恢复并不是单独存在的,它是快速重传的后续处理。
通常认为客户端接收到3个ACK后,就会开始快速重传,但是如果还有更多的重复ACK呢,这个时候就是快速恢复要做的。
数据传输方式和交换方式
我们都知道两台计算机之间是通过物理层在某种传输介质(信道)上传输数据,实现相邻计算机节点之间数据(比特流)的透明传送。
可是这些数据在信道上是怎么传输的呢?
实际上计算机有着一下几种不同的传输方式:
- 按数据传输的顺序可分为:并行传输和串行传输
- 按数据传输的同步方式可分为:同步传输和异步传输
- 按数据传输的流向和时间关系可分为:单工、半双工和全双工数据传输(通信)
按数据传输的流向和时间关系分类
单工通信
单工数据传输是两个数据站之间只能沿一个指定的方向进行数据传输。即发送方和接收方固定。单向传输,仅需要一条信道
半双工通信
半双工数据传输是两数据站之间可以在两个方向上进行数据传输,但不能同时进行。即通信的双方都可以发送和接收,但不能同时发送和接收。交替传输,需要两条信道
【简单的说就是有两条通道,一条通道工作另一条就不能工作】
全双工通信
全双工数据传输是在两数据站之间,可以在两个方向上同时进行传输。即双方可以同时发送和接收。双向同时传输
按数据传输的顺序分类
串行传输
串行传输是数据流以串行方式在一条信道上传输。
该方法易于实现。缺点是要解决收、发双方码组或字符的同步,需外加同步措施。
并行传输
并行传输是将数据以成组的方式在两条以上的并行信道上同时传输。例如采用 8 单位代码字符可以用 8 条信道并行传输,一条信道一次传送一个字符。因此不需额外的措施就天然的实现了收发双方的字符同步。
缺点是传输信道多,设备复杂,成本较高,故较少采用。
按数据传输的同步方式划分
同步传输
同步传输就是发送方和接收方的时钟要同步。以固定时钟节拍来发送数据信号,数据的传送以一个数据块为单位,因此同步传输也称区块传输。
在串行数据流中,各信号码元之间的相对位置都是固定的,接收端要从收到的数据流中正确分发送的字符,发送端必须建立起始位和结束位。【起始位和结束位方便识别接收到的数据是否完整,同时结束位还是用于告诉对方看到这个结束位就说明数据传输完了】
发送端发送的数据格式:同步符号(起始字符)+数据块+同步符号(结束字符)
同步传输方式的优点是不需要像异步传输一样对每一个字符单独加起、止码元,因此传输效率较高。缺点是实现技术较复杂。通常用于高速数据传输
异步传输
异步传输就是发送方和接收方没有始终同步。
异步传输每次传送一个字符代码(5~8 bit),在发送每一个字符代码的前面均加上一个 “起” 信号(起始位),后面均加一个 “止” 信号(终止位)。字符可以连续发送,也可以单独发送;不发送字符时,连续发送止信号。
每一字符的起始时刻可以是任意的(这也是异步传输的含意所在),也就是说发送方可以在任何时刻发送这些字符,而接收方并不知道它们会在什么时候到达。
那么如何区分一个个字符呢?
接收端是根据字符之间的止信号到起信号的跳变(“1”→“0”)来检测识别一个新字符的“起”信号,从而正确地区分出一个个字符。因此,这样的字符同步方法又称起止式同步。
1 | 例子: |
异步传输的优点是:实现同步比较简单,收发双方的时钟信号不需要精确的同步。
缺点是每个字符增加了 2~3 bit,降低了传输效率。它常用于低速数据传输。
数据交换方式
数据交换(Data Switching)是指在多个数据终端设备之间,为任意两个终端设备建立数据通信临时互连通路的过程。通俗来说交换是就通过某些交换中心将数据进行集中和传送,传输线路为各个用户共用,从而大大节省通信线路,降低系统费用。
| 电路交换 | 报文交换 | 分组交换 | |
|---|---|---|---|
| 建立连接 | 需要 | 不需要 | 不需要 |
| 数据交换单位 | 比特流 | 报文 | 分组 |
| 传输方式 | 比特流直流 | 存储转发 | 存储转发 |
| 每个分组沿着规定路径 | 是 | 不是 | |
| 分组按序到达 | 是 | 不是 | |
| 优点 | 通信时延小; 实时性强; 适用范围广; 控制简单; 避免冲突 |
无需建立连接; 动态分配陆续; 可靠性高; 线路利用率高; 可提供多目标服务 |
加速传输; 简化存储管理; 减少出错几率和重发数据 |
| 缺点 | 建立连接时间长; 信道利用率低; 缺乏统一标准; 灵活性差 |
由于存储转发导致时延; 对报文大小没有限制,需要较大的存储缓存空间 |
由于存储转发导致时延; 工作量大,可能出现分组丢失等情况 |
方式的选择
- 传送数据量大,且传送时间远大于呼叫时,选择电路交换。电路交换传输时延最小。
- 当端到端的通路有很多段的链路组成时,采用分组交换传送数据较为合适
- 从信道利用率上看,报文交换和分组交换优于电路交换,其中分组交换比报文交换的时延小,尤其适用于计算机之间的突发式的数据通信(比如我们用微信发消息)
IP协议
什么是IP协议
IP 协议是整个 TCP/IP 协议族的核心,也是构成互联网的基础,位于 TCP/IP 模型的网络层
IP 协议用于屏蔽下层物理网络的差异,为上层提供统一的 IP 数据报
IP 协议提供无连接的、不可靠的、尽力的数据报投递服务:
- 无连接的投递服务
发送端可于任何时候自由发送数据,而接收端永远不知道自己会在何时从哪里接收到数据。每个 IP 数据报独立处理和传输, 一台主机发出的数据报序列,可能会走不同的路径, 甚至有可能其中的一部分数据报会在传输过程中丢失 - 不可靠的投递服务
IP 协议本身不保证 IP 数据报投递的结果。在传输的过程中,IP 数据报可能会丢失、重复、延迟和乱序等, IP 协议不对内容作任何检测,也不将这些结果通知收发双方 - 尽力投递服务
每个数据链路上会规定一个最大传输单元 MTU,如果 IP 数据报的长度超过 MTU,那么网络层就会把这些报文分割成一个一个的小组(分组)进行传送,以适应具体的传输网络
IP地址
什么是IP地址
ip地址就是给因特网上的每台设备都规定了其全世界唯一的地址
IP 地址就好像电话号码(地址码):有了某人的电话号码,你就能与他通话了。同样,有了某台主机的 IP 地址,你就能与这台主机通信了
按照 TCP/IP 协议规定,IP 地址用二进制来表示,每个 IP 地址长 32 比特,也就是 4 个字节(IPV4是32比特/4字节,IPV6则是128比特/16字节)
IPV4 地址的最大值就是 $2^{32}=4294967296$
一个采用二进制形式的 IP 地址是一串很长的数字,人们处理起来也太费劲了。为了方便人们的使用,IP 地址习惯性地被写成十进制的形式,使用 “.” 分开不同的字节。这种表示法叫做点分十进制表示法,这显然比一连串二进制地 1 和 0 容易记忆得多。
IP 地址和 MAC 地址
IP 地址是根据网卡(网络适配器)来的配置的。像服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。
那为什么有了MAC地址还要有IP地址呢?
- 网络层指定了从哪个主机(「源 IP 地址」)发送到哪个主机(「目的 IP 地址」)。源 IP 地址和目标 IP 地址在传输过程中是不会变化的
- 而数据链路层则是根据 MAC 地址在一个接一个的区间中进行传输的,每个区间内的出发地址即「源 MAC 地址」,每个区间内的目的地址即「目的 MAC 地址」。显然,随着数据的传输,源 MAC 地址和目的 MAC 地址会不断的发生变化
举个例子:我们把数据链路层当成乘坐高铁从广州到北京,再从北京转乘到上海,再在上海转乘到武汉的旅客,那么网络层就相当于每个车站的工作人员,在数据链路层每次转乘时,网络层为其购买了一张标有下一个 MAC 地址的车票。因此,即使旅客(数据链路层)不知道其最终目的地也没有关系,工作人员(网络层)会给你做出指引。
而网络层做出指引的过程,我们将其称为路由控制
IP地址分类
互联网诞生之初,32 位的 IP 地址(也就是 IPV4 地址)显得很充裕,于是大佬们对这些看似庞大的 IP 地址进行了分类:

【这里说明一下,类跟段不是同一个东西,经常看到有人说C段,B段,实际上是指一个ip地址第几个部分,如123.123.123这是一个C段,123.123这是一个B段】
如上图所示,A 类 IP 地址的首位是 0,B 类 IP 地址的前几位是 10,C 类 IP 地址的前几位是 110……,我们将这些称之为分类号,用于区分 IP 地址的类别。
其中,A、B、C 类地址主要分为网络号和主机号两个部分:
- 网络号:网络号表示其属于互联网的哪一个网络
- 主机号:主机号表示其属于该网络中的哪一台主机
为什么要分离网络号和主机号呢?
因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址(网络号)是否相同:
- 如果网络地址相同,表明接受方在本网络上(本地网络主机),那么可以把数据包直接发送到目标主机,无需转发给其他的网络
- 网络号不相同的主机称之为远程网络主机,远程网络中的主机要相互通信必须通过本地网关(Gateway)来传递转发数据
路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的,进而把数据包转发给对应的网络内
IP广播
广播地址用于在同一个链路中相互连接的主机之间发送数据包,即一个发送方对应多个接收方。接收方在接收到数据包之后,可以根据自己的需要选择接收还是丢弃。
简单地说就是老师在班上通知一会下课班长来办公室一趟。班长收到了,其他同学都收到了,但是他们不用理会这件事,因为这件事跟他们没关系,只要班长响应就好了
当主机号全为1时,就表示该网络的广播地址。如127.0.0.0/16,转换成二进制是
1 | 10101100.00010100.00000000.00000000 |
将这个地址的主机部分全部改为1,则形成广播地址
1 | 10101100.00010100.11111111.11111111 |
换成十进制就是172.20.255.255
广播地址可以分本地广播和直接广播两种
- 本地广播
在本网络内广播的叫做本地广播,如192.168.0.0/24,广播地址为192.168.0.255。因为这个广播地址的ip包会被路由器屏蔽,所以不会到达192.168.0.0/24以外的其他链路上 - 直接广播
在不同网络之间的广播叫直接广播,如网络地址为192.168.0.0/24的主机向192.168.1.255/24的目标地址发送ip包。收到这个包的路由器将数据发送给192.168.1.0/24,从而使得所有192.168.1.1~192.168.1.254的主机都能接收到这个包
PS:由于直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发广播包,即本地广播,广播包无法穿透路由
IP单播
广播模式下,有一个发送方,多个接收方。单播模式下,只有一个发送方和接收方。
单播是可以穿透路由器的,换句话说就是路由器会对数据包进行转发。
IP多播
多播使用的是D类地址,其中D、E两类的地址是没有主机号的,所以不用于主机IP。
如果一个ip首位是1110,就可以确认它是多播地址,剩下的28位可以称为多播的组编号。
那什么是多播(组播)呢?
多播用于将包发送给特定组内的所有主机(可以穿透路由器)【就一个发送方,多个接收方】,因为它是直接使用IP协议,因此它不存在可靠传输。
在人们使用多播功能之前,一直采用广播的方式。通过广播将数据发送给所有终端主机,再由这些主机 IP 之上的一层去判断是否有必要接收数据。这种方式会给那些毫无关系的网络或主机带来影响,造成网络上很多不必要的流量。而且由于我们在大部分情况下使用的本地广播是无法穿透路由的,所以多播这种既能够穿透路由,又可以实现只给那些必要的组发送数据包的技术就成为必选之路了。
子网划分
之所以需要进行子网划分,是因为传统的 IP 地址分类可能会造成资源浪费
举个例子:B类网络在理论上,一个链路上允许大约$2^{16}\approx6$万台计算机连接,但在实际生活中,很少出现这种情况。所以直接使用A、B、C类地址,十分浪费资源。
所以就出现了子网划分。
什么是子网划分
所谓的子网划分就是将传统的两级IP地址(网络号+主机号)转换成粒度更小的三级IP地址(网络号+子网号+主机号)。
一句话概括就是将主机地址划分为子网号和子网内的主机号
子网主机号不能全为0或者全为1,同时划分后外面看里面,里面仍然是一个整体网络,外面是无法看见你是否划分了的。只有进入到里面,才知道你是否有划分。
子网掩码
子网掩码只有一个作用,就是将某个 IP 地址划分成网络地址和主机地址两部分
子网掩码由一连串的 0 和 1 构成(0 或 1 必须连续),二级 IP 地址中的网络号和三级 IP 地址中的网络号 + 子网号对应到子网掩码中都用 1 来表示,而主机号对应到子网掩码中用 0 来表示。

计算方法:将 IP 地址与子网掩码做按位 AND(与)运算(只有两个都为 1,结果才为 1,否则为 0)
1 | 举个例子: |
实际上子网掩码的作用就是用来分离网络号和主机号,所以我们一般都是直接在IP地址后面著名网络号的位数(网络号+子网号)
如192.168.1.0,子网掩码255.255.255.192,我们可以直接写成192.168.1.0/26,这里的26就表示网络号+子网号一共26位。
CIDR
直到 20 世纪 90 年代中期,向各种组织分配 IP 地址都以 A、B、C 等分类为单位进行。对大的组织会分配A类,小的则分配C类。但是A类一共只有128个,C类最多允许254台计算机相连,因此很快就出现了IP地址池资源不足。
于是人们开始放弃 IP 地址的分类,采用任意长度分割 IP 地址的网络号和主机号,这种方式就是CIDR(无类型域间选路)
CIDR的表现形式为a.b.c.d/x,其中/x表示前x位属于网络号(网络前缀),网络号的长度可以根据需求进行变化,如128.14.35.7/20表示该ip地址的前20个网络号,剩余的12个是主机号。
CIDR 把网络号(都相同的连续 IP 地址组成一个 CIDR 地址块,如203.183.224.1到203.183.225.254的地址合并成一个网络
1 | 203.183.224.1是1100 1011 1011 0111 1110 0000 0000 0001 |
NAT地址转换
IP 地址并不是根据主机台数来配置的,而是根据网卡(网络适配器)来的
但因为现在家家户户都有电脑,现在的IPV4根本不够用,CIDR也没法减缓IPV4的消耗速度,所以NAT地址转换就出来了。
NAT地址转换(Network Address Translator 网络地址转换)就是用于在本地网络中使用私有地址,在连接互联网时使转而使用全局 IP 地址的技术

以 10.0.0.10 主机与 163.221.120.9 主机的通信为例。利用 NAT,途中的 NAT 路由器将发送源 IP 地址 10.0.0.10 转化为全局唯一的 IP 地址 202.244.174.37 后,再发送数据。反过来,当数据包从地址 163.221.120.9 发送过来时,目标 IP 地址 202.244.174.37 先被转换成私有 IP 地址 10.0.0.10 后,再被转发。
路由控制
路由控制 Routing 是指将 IP 数据报发送给最终目标地址的功能。即使网络非常复杂,也可以通过路由控制确定到达最终目的地的通路。一旦这个路由控制的运行出现异常,分组数据极有可能迷失方向,无法到达目标地址。
为了将数据包发送给主机,所有主机和路由器都维护着一张路由控制表,这张表记录两个字段
- IP地址
- 如果想要到达这个 IP 地址,在当前路由器,数据包的下一步应该是发送到哪个路由器
在发送 IP 数据报时,首先要确定 IP 数据报首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 数据报转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。
一些基本概念
默认路由:是指路由表中任何一个地址都能与之匹配的记录,一般标记为 0.0.0.0/0 或 default
环回地址:环回地址是同一台计算机上的程序之间在进行网络通信时所使用的一个默认地址。当计算机使用这个特殊的 IP 地址或主机名时,数据包就不会流向网络
路由协议
路由控制表的形式有两种
- 静态路由控制(管理员手动设置)
- 动态路由控制(路由器与其他路由器相互交换信息时自动刷新)
为了让动态路由即时刷新路由控制表,在网络上互联的路由器之间必须设置好某种协议,保证正常读取路由控制信息。这种协议就称为路由协议。
目前的路由协议大致可以分为两类
- 外部网关协议EGP(包含 RIP、OSPF 等协议)
- 内部网关协议IGP(包含 BGP 等协议)
ARP协议
ARP 是用来实现由 IP 地址到 MAC 地址转化的一个「网络层协议」
概要
「ARP(Address Resolution Protocol )地址解析协议」:实现由 IP 地址到 MAC 地址的转换。准确的来说,ARP 协议以目标 IP 地址为线索,用来定位下一个应该数据分包的网络设备对应的 MAC 地址。
1 | 举个例子: |
我们知道路由表记录着数据包下一步应该发送到的 IP 地址,但是数据链路层进行通信的时候,它只认得 MAC 地址。所以,用来实现 IP 地址到 MAC 地址转换的 ARP 协议在此时就显得尤为重要。
工作原理
ARP是借助ARP请求和ARP响应这两种类型的包确定MAC地址的。每一个主机都有一个ARP高速缓存,里面有本局域网上的各主机和路由器的IP 地址到 MAC 地址的映射表
假设现在有两台主机,一台叫A,一台叫B。A要向同一链路上的主机B发送IP数据段,而A知道B的IP地址却不知道对方的MAC地址,那么他们会进行以下步骤
- A为了获得B的MAC地址,先去查询自己的ARP高速缓存中有没有主机B的相关记录
- 如果没有,A就会通过广播的方式发送ARP请求包(携带自己的 IP 地址 和 MAC 地址 以及 目标主机的 IP 地址),表示自己想要获得B的MAC地址
- 同一链路上的所有主机或路由器接收到这个包,如果某个主机或路由的 IP 地址与这个 ARP 请求包中包含的目标主机的 IP 地址相同,那么这个节点就将自己的 MAC 地址塞入 「ARP 响应包」中返回给 A
- A收到B的ARP响应包后,向自己的ARP高速缓存中写入B的IP地址和MAC地址的映射,方便以后找B时使用。(这个缓存是有期限的,过了这个期限缓存的内容将被清空)
DNS协议
在了解DNS协议之前先明白两个概念
- IP地址:看上面的内容就知道了(一长串能够唯一地标记网络上的计算机的数字)
- 域名:又称网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)
www.baidu.com这就是一个域名,而www.baidu.com/abcd.html则是一个网址
由于IP地址难于记忆以及不好显示地址组织的名称和性质,所以就设计出了域名。通过域名解析协议(DNS,Domain Name System)来将域名和 IP 地址相互映射
其中将域名映射成 IP 地址称为正向解析,将 IP 地址映射成域名称为反向解析
DNS协议可以使用TCP也可以使用UDP,不管用哪个都是使用53端口,但大多数情况都是使用UDP进行传输
域名有着一定的层次结构,从上到下依次为「根域名」、「顶级域名」(top level domain,TLD)、「二级域名」、(三级域名)
顶级域名
顶级域名(TLD),即最高层级的域名,就是网址的最后一个部分。如www.baidu.com里面的.com就是最高层级的域名。
ICANN(Internet Corporation for Assigned Names and Numbers)【全世界域名的最高管理机构】的一项主要工作就是规定哪些字符串可以当作顶级域名。这些域名大致可以分成两类
- 「通用顶级域名」(gTLD),比如
.com、.net、.edu、.org、.xxx等等 - 「国家顶级域名」(ccTLD),代表不同的国家和地区,比如
.cn(中国)、.io(英属印度洋领地)、.cc( 科科斯群岛)、.tv(图瓦卢)等
同样的,因为域名太多,ICANN管不过来,所以它都是每个顶级域名都找个托管商负责管理,如.cn国家顶级域名的托管商就是中国互联网络信息中心(CNNIC),.cn域名的各种政策都由它来决定
二级域名
二级域名(Second Level Domain,SLD)在通用顶级域名或国家顶级域名下具有不同的意义
- 通用顶级域名下的二级域名:一般是指域名注册人选择使用的网上名称,如
yahoo.com(商业组织通常使用自己的商标、商号或其他商业标志作为自己的网上名称,如baidu.com) - 国家顶级域名下的二级域名:一般是指类似于通用顶级域名的表示注册人类别和功能的标志。例如,在
.com.cn域名结构中,.com此时是置于国家顶级域名.cn下的二级域名,表示中国的商业性组织,以此类推。
三级域名是形如www.baidu.com的域名,可以当作是二级域名的子域名,特征为域名包含两个.。对于域名所有者/使用者来说,三级域名都是二级域名的附属物,三级域名甚至不能称为域名,一般称之为域名下的 “二级目录”。
根域名
什么是根域名?
由于 ICANN 管理着所有的顶级域名,所以它是最高一级的域名节点,被称为根域名(root domain)。在有些场合,www.xxx.com 被写成 www.xxx.com.,即最后还会多出一个点。这个点就是根域名。

所有域名的查询都必须先查询根域名,因为只有根域名会告诉你这个顶级域名由哪台服务器管理。
ICANN 维护着一张列表(根域名列表),里面记载着顶级域名和对应的托管商
由于根域名列表很少变化,大多数DNS服务商都会提供它的缓存,因此查询并不频繁。
域名服务器
域名服务器是指管理域名的主机和相应的软件,它可以管理所在分层的域的相关信息。一个域名服务器所负责管里的分层叫作 区 (ZONE)
域名的每层都设有一个域名服务器:
- 根域名服务器
- 顶级域名服务器
- 权限域名服务器
.png)
除了上图的三种DNS服务器,还有一种叫本地域名服务器。这种服务器不在DNS层次结构中,但是很重要的一种DNS服务器。
根域名服务器
ICANN维护着一张根域名列表,里面记载着顶级域名和对应的托管商,这张域名列表正式名是DNS根区(DNS root zone),保存DNS根区文件的服务器就叫DNS 根域名服务器(root name server)。而根域名服务器就是保存所有的顶级域名服务器的地址
由于早期DNS查询结果是一个512字节的UDP数据包,这个包最多可以容纳13个服务器的地址,因此就规定了全世界有13个根域名服务器,编号从a.root-servers.net 一直到 m.root-servers.net。其中 10 台设置在美国,另外各有一台设置于荷兰、瑞典和日本。
因为所有域名的查询都必须先查询根域名,所以基本上所有的域名服务器都会注册一份根域名服务器的 IP 地址的缓存,用于在必要的时候向其发送请求。
顶级域名服务器
按照根域名服务器管理顶级域名的逻辑,顶级域名服务器显然就是用来「管理注册在该顶级域名下的所有二级域名」,「记录这些二级域名的 IP 地址」。
权限域名服务器
如果一个二级域名或者一个三/四级域名对应一个域名服务器,那么就要很多的服务器。因此大家都是使用划分区解决这个问题的。而权限服务器就是负责管理一个区的域名服务器
划分区
区和域其实是不同的,区可以有多种不同的划分方法
1 | 举个例子: |

本地域名服务器
本地域名服务器也称为权威域名服务器
这种服务器是电脑解析时的默认域名服务器,即电脑中设计的首选DNS服务器和备选DNS服务器,常见的有电信、联通、谷歌、阿里等。
每个因特网服务提供者或一所大学,甚至一所大学中的各个系,都可以拥有一个本地域名服务器。当一台主机发出 DNS 查询请求时,这个查询请求报文就发送给该主机的本地域名服务器。本地域名服务器管理本地域名的解析和映射,并且能够向上级域名服务器进行查询
DNS查询方式
DNS有两种查询的方法
- 递归查询
- 迭代查询
递归查询就是:请求的接收者不知道所请求的内容,那么「接收者将扮演请求者」,发出有关请求,直到获得所需要的内容,然后将内容返回给最初的请求者
以上两个简单地说就是:
- 递归:A请求B,那么B作为请求的接收者一定要给A答案,没有也要去其他地方问出来
- 迭代:A请求B,如果B没有答案,就会告诉A我没有,你去xxx那里获取,就不会自己去询问其他人获取答案。
一般来说,域名服务器之间的查询使用迭代查询方式,以免根域名服务器的压力过大
域名缓存
一般是使用缓存保存域名和IP地址的映射
计算机中DNS记录在本地有两种缓存方式:浏览器缓存和操作系统缓存
- 浏览器缓存:浏览器在获取网站域名的实际 IP 地址后会对其进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的 DNS 缓存时间,如 Chrome 的过期时间是 1 分钟,在这个期限内不会重新请求 DNS
- 操作系统缓存:操作系统的缓存其实是用户自己配置的 hosts 文件
win10的话可以使用cmd输入
ipconfig/displaydns查看电脑中缓存的域名
在浏览器中进行访问的时候,会优先查询浏览器缓存,如果未命中则继续查询操作系统缓存,最后再查询本地域名服务器,然后本地域名服务器会递归的查找域名记录,最后返回结果。「主机和本地域名服务器之间的查询方式是递归查询」,也就是说主机请求本地域名服务器,那么本地域名服务器作为请求的接收者一定要给主机想要的答案。
完整域名解析过程
正向解析:
- 搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表
- 没有收获则继续搜索操作系统的 DNS 缓存
- 还是没有收获则操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的 DNS 缓存,查找成功则返回结果(这里主机和本地域名服务器之间的查询是递归查询)
- 还是没有收获,则本地域名服务器向上级域名服务器进行查询,通过以下方式进行「迭代查询」
- 首先本地域名服务器向根域名服务器发起请求,根域名服务器是最高层次的,它并不会直接指明这个域名对应的IP地址,而是返回顶级域名服务器的地址。
- 本地域名服务器拿到这个顶级域名服务器的地址后,就向其发起请求,获取权限域名服务器的地址
- 本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
- 本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
- 操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来
- 浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起来
HTTP
www的构建技术有三项
- 把 SGML(标准通用标记语言)作为页面的文本标记语言 HTML
- 作为文档传递协议的 HTTP
- 指定文档所在地址的 URL
什么是HTTP
HTTP叫做超文本传输协议(HyperText Transfer Protocol),传输的内容是超文本
- 文本:互联网早期的时候只是简单的字符文字,现在「文本」的涵义已经可以扩展为图片、视频、压缩包等,在 HTTP 眼里这些都算做「文本」
- 超文本:就是超越了普通文本的文本,它是文字、图片、视频等的混合体。最关键有「超链接」,能从一个超文本跳转到另外一个超文本
HTTP是目前互联网上应用最为广泛的一种网络协议。所有的 WWW(万维网) 文件都必须遵守这个标准。HTTP 和 TCP/IP 协议簇中的众多协议一样,用于客户端和服务器端之间的通信。
URI和URL
URL(Uniform Resource Location,统一资源定位符)是我们使用 Web 浏览器访问 Web 页面时需要输入的网页地址
URI(Uniform Resource Identifier )的定义如下
- Uniform:统一规定的格式可方便处理多种不同类型的资源
- Resource:资源的定义是可标识的任何东西。不仅可以是单一的,也可以是一个集合
- Identifier:标识可标识的对象。也称为标识符
所以URI实际上是由某个协议方法表示的资源定位标识符。
URI有两种格式
- 相对URI:指从浏览器中基本 URI 处指定的 URL,形如
/user/logo.png - 绝对URI:使用涵盖全部必要信息
综上所述,URL实际上就是URI的子集。
HTTP请求和响应
HTTP协议规定,两台计算机之间使用HTTP协议进行通信时,在一条通信线路上必定有一端是客户端,另一端则是服务端。当在浏览器中输入网址访问某个网站时, 你的浏览器(客户端)会将你的请求封装成一个 HTTP 请求发送给服务器站点,服务器接收到请求后会组织响应数据封装成一个 HTTP 响应返回给浏览器。
一句话概括:先从客户端开始建立通信,服务器端在没有接收到请求之前不会发送响应
HTTP请求报文
HTTP请求报文由3大部分组成
- 请求行(必须在HTTP请求报文的第一行)
- 请求头(从第二行开始,到第一个空行结束。其中请求头和请求体之间有一个空行)
- 请求体(通常以键值对方式传递数据)
HTTP请求方法
请求行中的方法的作用在于可以指定请求的资源按照期望产生某种行为,即使用方法给服务器下命令
包括(HTTP 1.1):GET、POST、PUT、HEAD、DELETE、OPTIONS、CONNECT、TRACE。当然,我们在开发中最常见也最常使用的就只有前面三个。
GET(获取资源)
GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容
POST(传输实体主体)
POST 主要用来传输数据,而 GET 主要用来获取资源
PUT(传输文件)
PUT 方法用来传输文件,由于自身「不带验证机制,任何人都可以上传文件」,因此存在安全性问题,一般不使用该方法
HEAD(获取报文首部)
和 GET 方法类似,但是不返回报文实体主体部分。主要用于确认 URI 的有效性以及资源更新的日期时间等
DELETE(删除文件)
与 PUT 功能相反,用来删除文件,并且同样不带验证机制,按照请求 URI 删除指定的资源
OPTIONS(查询支持的方法)
用于获取当前 URI 所支持的方法。若请求成功,会在 HTTP 响应头中包含一个名为 “Allow” 的字段,值是所支持的方法,如 “GET, POST”
HTTP请求头
请求头用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容
- Referer:表示这个请求是从哪个 URI 跳过来的
如在百度搜索淘宝网,那么进入淘宝网的请求报文中,Referer 的值就是:www.baidu.com。
这个字段通常用于防盗链,如果是直接访问就不会存在这个头 - Accept:告诉服务端,该请求所能支持的响应数据类型(对应的,HTTP 响应报文中也有这样一个类似的字段
Content-Type,用于表示服务端发送的数据类型,如果Accept指定的类型和服务端返回的类型不一致,就会报错) - Host:告知服务器请求的资源所处的互联网主机名和端口号
- Cookie:客户端的 Cookie 就是通过这个报文头属性传给服务端的
- Connection:表示客户端与服务连接类型;Keep-Alive 表示持久连接,close 已关闭
- Content-Length:请求体的长度
- Accept-Language:浏览器通知服务器,浏览器支持的语言
- Range:对于只需获取部分资源的范围请求,包含首部字段 Range 即可告知服务器资源的指定范围
- ……
HTTP响应报文
HTTP的响应报文由三部分组成:
- 响应行(必须在HTTP响应报文的第一段)
- 响应头(从第二行开始,到第一个空行结束,响应头和响应体之间存在一个空行)
- 响应体
HTTP状态码
HTTP 状态码负责表示客户端 HTTP 请求的的返回结果、标记服务器端处理是否正常、通知出现的错误等工作
| 状态码 | 类别 | 原因短语 |
|---|---|---|
| 1xx | Informational 信息性状态码 | 接收的请求正在处理 |
| 2xx | Success 成功状态码 | 请求正常处理完毕 |
| 3xx | Redirection 重定向状态码 | 需要进行附加操作以完成请求 |
| 4xx | Client Error 客户端错误状态码 | 服务器无法处理请求 |
| 5xx | Server Error 服务器错误状态码 | 服务器处理请求出错 |
2xx
200 OK:客户端请求成功204 No Content:无内容。服务器成功处理,但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面。206 Partial Content:服务器已经完成了部分 GET 请求(客户端进行了范围请求)。响应报文中包含 Content-Range 指定范围的实体内容
3xx
301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置。302 Found:临时重定向,表示请求的资源临时搬到了其他位置303 See Other:临时重定向,应使用GET定向获取请求资源。303功能与302一样,区别只是303明确客户端应该使用GET访问304 Not Modified:表示客户端发送附带条件的请求(GET方法请求报文中的IF…)时,条件不满足。返回304时,不包含任何响应主体。虽然304被划分在3XX,但和重定向一毛钱关系都没有307 Temporary Redirect:临时重定向,和302有着相同含义。POST不会变成GET
4xx
400 Bad Request:客户端请求有语法错误,服务器无法理解。401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用。403 Forbidden:服务器收到请求,但是拒绝提供服务404 Not Found:请求资源不存在。比如,输入了错误的 URL415 Unsupported media type:不支持的媒体类型
5xx
500 Internal Server Error:服务器发生不可预期的错误。503 Server Unavailable:服务器当前处于超负载或正在停机维护,暂时不能处理客户端的请求,一段时间后可能恢复正常
HTTP响应头
响应头也是用键值对 k:v,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等。
.png)
HTTP连接管理
短连接(非持久连接)
在 HTTP 协议的初始版本(「HTTP/1.0」)中,客户端和服务器每进行一次 HTTP 会话,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如JavaScript 文件、图像文件、CSS文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话。
这种方式就叫短连接。
每次HTTP请求都要重新建立一次连接,频繁使用三次握手四次挥手会消耗大量的通信量
一句话说明:每进行一次HTTP会话就要进行三次握手四次挥手。
长连接(持久连接)
从 HTTP/1.1 起,默认使用长连接也称持久连接 keep-alive。使用长连接的 HTTP 协议,会在响应头加入这行代码:Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
一句话说明:在一段时间内,三次握手后可以进行多次HTTP会话,直到时间到了就会进入四次挥手
HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。
流水线(管线化)
默认情况下,HTTP 请求是按顺序发出的,下一个请求只有在当前请求收到响应之后才会被发出。由于受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。
持久连接使得多数请求以流水线(管线化 pipeline)方式发送成为可能,即在同一条持久连接上连续发出请求,而不用等待响应返回后再发送,这样就可以做到同时并行发送多个请求,而不需要一个接一个地等待响应了
一句话概括:原本请求是我发送一个给你,你收到了我在发一个给你。现在是我发一个给你,不管你收没收到,可以继续发一个给你。
无状态的HTTP
HTTP 协议是无状态协议。换句话说就是他不会对之前发生过的请求和响应的状态进行管理。(就是不会根据之前的状态进行本次的请求处理)
因为无状态协议,因此HTTP不会记住用户登录的状态,所以我们就要使用cookie
Cookie 通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。具体来说,Cookie 会根据从服务器端发送的响应报文中的一个叫作 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值发送出去。服务器端收到客户端发来的 Cookie 后,会去检查究竟是哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
HTTP断点续传
断点续传指的是下载传输文件可以中断,之后重新下载时可以接着中断的地方开始下载,而不必从头开始下载。断点续传需要客户端和服务端都支持。
原理是 HTTP 请求头中的字段 Range 和响应头中的字段 Content-Range 的简单使用。客户端一块一块的请求数据,最后将下载回来的数据块拼接成完整的数据。
HTTP的缺点
- 通信使用明文(不加密),内容可能被「窃听」
- 不验证通信对方的身份,因此有可能遭遇「伪装」
- 无法证明报文的完整性,所以有可能被「篡改」
窃听
由于 HTTP 本身不具备加密的功能,所以无法做到对 HTTP 请求和响应报文进行加密。但即使是加密过的通信内容,也会被窥视到,这点和未加密的通信是相同的
只能说经过加密后的内容,即便被攻击者窥视到,他也可能无法破解其中的含义罢了,但是加密处理后的报文信息本身还是会被看到的
伪装
HTTP 的请求和响应不会对通信方进行确认,所以任何人都可以发起请求,而服务器对请求者来者不拒,只要接收到请求,就会返回一个响应
因此会出现以下的隐患
- 客户端发送的 HTTP 请求报文可能到达的并非真正的目的服务器,可能是已伪装的服务器
- 服务器返回的 HTTP 响应报文可能也并没有被正确的客户端所接收,可能是已伪装的客户端
- 无法确定正在通信的对方是否具备访问权限
- 无法判定请求来自何方,出自谁手
- 即使是无意义的请求也会照单全收
篡改
HTTP 无法证明报文的完整性
完整性指信息的准确度,无法证明完整性,在 HTTP 请求或响应 送出之后直到对方接收的这段时间内,即使请求或响应的内容遭到攻击者篡改,也没有办法获悉。
所以HTTP 没有办法确认发送出去的请求和接收到的请求是否一致
最简单的一种攻击方法就是中间人攻击
HTTPS
HTTPS 协议并非应用层的一个新协议,只是 HTTP 通信接口部分用 SSL(Secure Socket Layer)和 TLS(Transport Layer Security)协议代替而已
通常 HTTP 是直接和 TCP 进行通信的,当使用 SSL 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 进行通信
所谓 HTTPS,就是身批 SSL 协议外壳的 HTTP
采用 SSL 后,HTTP 就拥有了加密、证书和完整性保护等功能,而这些功能正是用来解决我们上述所说的 HTTP 不安全问题的,同时SSL 是独立于 HTTP 协议的,所有运行在应用层的协议都可以配合 SSL 协议使用。可以说,SSL 协议是当今世界上应用最为广泛的网络安全技术
HTTPS解决HTTP缺点的方案如下:
- 加密。【共享密钥加密、公开密钥加密、混合加密方式】
- 数字证书。
- 数字签名。
本文参考: