1、计算机网络体系结构
1.1 应用层
介绍:应用层通过定义位于不同主机间的多个进程之间的通信规则来使它们协同工作。
1.2 运输层
介绍:运输层对上层应用层,提供处于网络连接中的两台计算机的数据运输;对下层网络层,把从应用层处收到的数据进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。
1.3 网络层
介绍:网络层用来处理在网络上流动的数据包。
1.4 数据链路层
介绍:数据链路层用来解决计算机在网络中的通信信道。主要有两种类型:点对点信道和广播信道,分别使用了PPP协议和CSMA/CD协议。主要功能是封装成帧、透明传输和差错检测。
1.5 物理层
介绍:物理层用来处理计算机连接网络的硬件部分。
2、各种响应状态码
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息性状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成操作 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务端错误状态码) | 服务器处理请求出错 |
2xx(3种)
200 OK:表示从客户端发送给服务器的请求被正常处理并返回;
204 No Content:表示客户端发送给客户端的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回);
206 Patial Content:表示客户端进行了范围请求,并且服务器成功执行了这部分的GET请求,响应报文中包含由首部字段Content-Range指定范围的实体内容。
3xx (5种)
301 Moved Permanently:永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL;
302 Found:临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL;
301与302的区别:前者是永久移动,后者是临时移动(之后可能还会更改URL)
303 See Other:表示请求的资源被分配了新的URL,应使用GET方法定向获取请求的资源;
302与303的区别:后者明确表示客户端应当采用GET方式获取资源
304 Not Modified:表示客户端发送附带条件(是指采用GET方法的请求报文中包含if-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since中任一首部)的请求时,服务器端允许访问资源,但是发生的请求未满足条件。虽然被归类到以3开头的状态码中,但是和重定向没有关系。
307 Temporary Redirect:临时重定向,与303有着相同的含义,307会遵照浏览器标准不会从POST变成GET;(不同浏览器可能会出现不同的情况);
4xx (4种)
400 Bad Request:表示请求报文中存在语法错误;
401 Unauthorized:未经许可,需要通过HTTP认证;
403 Forbidden:服务器拒绝该次访问(访问权限出现问题)
404 Not Found:表示服务器上无法找到请求的资源,除此之外,也可以在服务器拒绝请求但不想给拒绝原因时使用;
5xx (2种)
500 Inter Server Error:表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误时;
503 Server Unavailable:表示服务器暂时处于超负载或正在进行停机维护,无法处理请求;
3、告知服务器意图的HTTP方法
POST和GET请求方式区别
GET一般用来获取资源,相应结果一般是某个资源;POST一般用来传输实体进行资源的修改,相应结果一般是数据的处理结果
GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变;
GET:特定浏览器和服务器对URL长度有限制;POST:由于不是通过URL传值,理论上数据不受限
POST的安全性要比GET的安全性高。
POST和PUT区别
POST一般用来传输实体;PUT一般用来传输文件
但HTTP/1.1的PUT方法自身不带验证机制,也就是任何人都可以上传文件,存在安全性问题,一般的WEB网站不使用这个方法
对应的取代方式是使用POST方法,然后指定一个参数用于接收文件并使用@RequestPart
注解,@RequestPart适用于复杂的请求域(如JSON,XML等),@RequestParam适用于key-value类型的请求域.
HEAD和GET区别
HEAD方法和GET方法一样都是获取资源的方法,但是HEAD方法不返回报文主体部分,只是返回响应首部。
4、URI和URL的区别是什么?
- URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
- URL(Uniform Resource Location) 是统一资源定位符,可以提供该资源的路径。URL是URI的子集,它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。
URI的作用像身份证号一样,URL的作用更像家庭住址一样。URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。
5、HTTP三次握手
三次握手主要作用是:
- TCP是面向连接的,三次握手是客户端与服务端进行数据传输前的准备工作。 这样做是为了建立可靠的传输信道,尽可能的保证数据的安全。
- 确认双方的接收能力和发送能力
- 指定自己的初始化序列号,为后面的可靠性做准备
三次握手过程
刚开始:服务器创建传输控制块TCB,准备接受客户端的连接请求,然后处于 Listen 状态。客户端创建传输控制块TCB,此时处于 Closed 的状态,
第一次握手:建立连接时,客户端发送连接请求报文段到服务器,这时首部的同步块SYN=1,同时初始序号为seq=x,TCP规定不能携带数据,但是要消耗一个序号。此时的TCP客户进程进入SYN-SEND状态,等待服务器确认;
第二次握手:服务端收到报文段后,如同意建立连接,则向客户端发送确认。这个报文段也不能携带数据,同样要消耗一个序列号。在报文段中ACK位为是1,确认号是ack=x+1;SYN位也为1,同时为自己选择一个初始序号seq=y,这时TCP服务器进程进入SYN-RECV状态。第二次握手确认了客户的SYN包,同时自己也发送一个SYN包,即SYN+ACK包
第三次握手:客户端收到服务端的后,还要向服务器给出确认。确认报文段的ACK位为1,确认号为ack=y+1,以及自己的序列号seq=x+1。TCP标准规定该报文段可以携带数据,如果携带数据则不消耗序列号,这种情况下的下一个报文段的序号仍为seq=x+1。此包发送完毕,客户端进入 ESTABLISHED状态,完成三次握手,TCP连接建立。当服务端收到客户端的确认后,也进入了 ESTABLISHED状态。
通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据。
三次握手的目的:
- 客户端发送数据给服务器,服务器确认自己可以接受客户端的请求。
- 服务器发送数据给客户端,客户端确认自己可以发送数据给服务器,也可以接受到服务器的请求。
- 客户端发送数据给服务器,服务器确认自己可以发送数据给客户端。
为何不用两次握手?
如果采用两次握手,客户端发送数据给服务器,服务器确认后就当连接开始。
假定出现一种异常情况,如果客户端发送一次请求给服务端,在指定时间后没响应再发了一个。服务端收到第二个请求后向客户端发送确认报文段,同意建立连接,于是连接建立了(两次握手)。而后面客户端的第一个请求由于某种原因例如网络延迟等到达了服务端,本来这是一个早已失效的报文段,但是服务端收到后又建立了新的连接,由于客户端并没有发出新的连接请求,在收到服务器的确认报文后并不会建立新的连接,也不会向服务端发送数据,而服务器认为新的连接已经建立了,一直等待客户端发送数据,服务器资源被白白浪费了。
6、HTTP四次挥手
由于socket是全双工的工作模式,一个socket的关闭,是需要四次握手来完成的
1、主动关闭方发送FIN,主动关闭的一方等待对方关闭,则进入FIN_WAIT_2
状态
2、被动关闭方收到FIN并回到ACK后,进入CLOSE-WAIT
状态
3、被动关闭方在完成所有数据发送后,调用close()操作,此时发送FIN包给主动关闭方,等到对方的ACK,进入LAST-ACK
状态
4、主动关闭方收到FIN包,并回复ACK包,此时进入TIME-WAIT
状态,而被动关闭方进入CLOSED
状态
5、等待2MSL时间后,主动关闭方结束TIME-WAIT
状态,进入CLOSED
状态
断开一个 TCP 连接则需要“四次挥手”:
- 客户端-发送一个 FIN,用来关闭客户端到服务器的数据传送
- 服务器-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号
- 服务器-关闭与客户端的连接,发送一个FIN给客户端
- 客户端-发回 ACK 报文确认,并将确认序号设置为收到序号加1
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束。
7、TCP和UDP区别
UDP 追求及时性,在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等
TCP 追求可靠性,提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。 TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的传输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。
用户数据报协议(UDP)和传输控制协议(TCP)
- TCP基于连接,数据传输前需要做好可靠性准备工作(三次握手);而UDP是无连接的,只要有数据就可发送了。
- TCP使用流量控制和拥塞控制等措施使传输更加可靠;而UDP则是不可靠的传输。
- TCP是面向流的数据模式(无边界),保证数据的有序性;而UDP是面向报文的数据模式(有边界),不保证数据的有序性。
- TCP传输速度相对UDP较慢,所需资源相比UDP多
- TCP首部开销较大(最大60字节,最小20字节);UDP首部开销较小(8字节)
- TCP仅支持单播,点对点的数据传输;而UDP不仅支持单播,还支持组播,广播。
8、TCP如何保证可靠性传输?(传输层)(6个)
- 校验和(16位)
在数据传输过程中,将发送的数据段分成若干个16位的整数。 将这些整数加起来,并且前面的进位不能丢弃,补在后面,最后取反, 得到校验和。
发送方在发送数据之前计算校验和,并将校验和填充到TCP报文中, 而接收方收到数据后,对数据以同样的方式进行计算,求出校验和, 与发送方的进行比对。如果比较失败,接收方将丢弃数据包。
- 确认应答ACK和序列号(32位)
在TCP传输过程中,每次接收方收到数据后,都会对发送方进行应答, 也就是响应ACK报文,这个报文中有对应的确认序列号。
- 连接管理
连接管理是TCP数据传输前和连接断开时的工作, 包括三次握手与四次挥手的过程。
- 超时重传
在TCP传输时,由于确认应答和序号机制,当发送方发送完数据后, 会等待接收方的ACK报文,并解析判断ACK报文(一般来说ACK为seq+1), 如果发送方一直没有等到接收方的ACK报文,那么将重新发送一遍数据。
- 流量控制:以字节为单位的滑动窗口实现(接收方角度)
滑动窗口是接收端的使用的窗口大小,用来告诉发送端接收端的缓存大小, 从而可以控制发送端的发送速度。 而发送端发送的速度则是使用发送端的窗口来实现的。
TCP连接发送端和接收端都有一个缓冲区,如果发送端的发送数据过快, 导致接收端来不及处理数据,缓冲区就被填充满了,那么接下来的数据, 接收方就会丢弃数据,导致丢包等连锁反应产生。
TCP根据接收端的处理能力,来决定发送端的发送速度,这个机制就是流量控制。 TCP的报文中,有一个16位的窗口字段, 窗口大小就是接收端计收数据缓冲区的剩余大小,这个数字越大, 代表接收端缓冲区的剩余空间越大。
接收端在发送ACK确认报文时,会将自己当前的窗口大小填入, 这样发送方就会根据ACK报文里的窗口大小的值改变自己的发送速度。 如果接收方窗口大小的值为0,那么发送方将停止发送数据, 并定期的向接收端发送窗口探测数据,让接收端把窗口大小告诉发送端。
- 拥塞控制:(拥塞窗口)(发送端角度)
发送端的窗口就是拥塞窗口了。在某段时间内,当网络中某一资源的需求量大于改资源所能提供的可用部分,网络就变得拥塞了。
所谓的拥塞控制就是防止过多的数据注入到网络中,这样可以使网络负荷不至于太重。
9、DNS解析过程(应用层)
DNS是一种域名解析服务,提供域名到IP地址之间的解析服务。
DNS服务器两种查询方式:迭代查询和递归查询
主机向本地域名服务器的查询一般都是采用递归查询。本地域名服务器向根域名服务器的查询通常是采用迭代查询。
1、递归查询是如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文(即替该主机继续查询),而不是让该主机自己进行下一步的查询。
2、迭代查询是当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器:“你下一步应当向哪个域名服务器进行查询”然后让本地域名服务器进行后续的查询(而不是替本地域名服务器进行后续的查询)。
10、ARP协议(网络层)
ARP协议是地址解析协议(Address Resolution Protocol
),TCP/IP分层结构中,把
ARP划分为网络层
。
它是通过解析IP地址
得到MAC地址
的,把从网络层使用的IP地址,解析出在数据链路层使用的硬件地址。
还有一个协议叫逆地址解析协议RARP
,它的作用的根据本机的硬件地址解析出IP地址,现在的DHCP协议已经包含了RARP协议。
工作原理:
每台主机或路由器在维护着一个ARP缓存表(ARP table),这个表包含IP地址到MAC地址的映射关系,表中记录了<IP地址,MAC地址>对,我称之为ARP表项,他们是主机最近运行时获得关于其他主机的IP地址到其他主机的MAC地址的映射
此映射表是动态更新的,因为网络上的主机是也是动态更新的,可能新增或减少一些主机,每个映射也都设置了`生存时间`,在主机A向主机B通信时,如果主机B的网络适配器坏了,那么对应的硬件地址也就改变了,而主机A的ARP高速缓存中还存放着B原先的硬件地址,并向B发送数据帧,那么B不能收到.等过了主机B的IP与硬件地址映射的生存时间后,主机A删除了这个映射,并可以通过广播重新找到了主机B的硬件地址.
发送数据:
当需要发送数据的时候,主机就会根据数据报中的目标IP地址信息,然后在ARP缓存表中进行查找对应的硬件地址.
如有,则将该硬件地址写入MAC帧,再将该MAC帧发往对应的硬件地址
如没有,也就是高速缓存中没有此映射,可能是主机B刚联网,或者主机A刚通电,此时主机A就自动运行ARP,步骤如下:
(1)主机A的ARP进程在局域网中广播发送一个请求分组,意图获取要发送的IP地址的硬件地址
(2)当主机B的IP地址与之相匹配时,便收下这个请求分组,其他不匹配的不收下这个请求分组
(3)并发送一个响应分组,以单播(注意不是广播)的形式发送给主机A
(4)A收到B的响应分组后,在高速缓存中写入主机B的IP地址到硬件地址的映射
主机A向B发送请求分组时,考虑到后面主机B也要向主机A发送请求分组,为了减少网络上的通信量,主机A在发送其ARP请求分组时,也把自己的IP地址和硬件地址写入到了ARP请求分组中,当主机B收到A的ARP请求分组时,就把主机A的这一映射写入到自己的ARP高速缓存中,方便后续B与A的通信.