大纲
计算机网络 基础 HTTP HTTP基本概念 GET与POST HTTP特性 HTTP缓存技术 HTTP与HTTPS HTTP演变 TCP TCP基本认识 TCP连接建立 TCP连接断开 Socket编程 UDP IP IP基本认识 IP地址的基础知识 IP协议相关技术 网络安全
基础
TCP/IP网络模型有哪几层?
TCP/IP网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层。
- 应用层:负责向用户提供一组应用程序,比如HTTP、DNS、FTP等;
- 传输层:负责端到端的通信,比如TCP、UDP等;
- 网络层:负责网络包的封装、分片、路由、转发,比如IP、ICMP等;
- 网络接口层:负责网络包在物理网络中的传输,比如网络包的封帧、MAC寻址、差错检测,以及通过网卡传输网络帧等。
不过,我们常说的七层和四层负载均衡,是用OSI网络模型来描述的,七层对应的是应用层,四层对应的传输层。
键入网址到网页显示,期间发生了什么?
Linux系统是如何收发网络包的?
一、HTTP
HTTP 常见面试题
HTTP基本概念
HTTP 是什么?
HTTP是超文本传输协议,是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超⽂本」数据的「约定和规范」。
HTTP常见的状态码有哪些?
1xx
类状态码属于提示信息,是协议处理中的⼀种中间状态,实际⽤到的⽐较少。
2xx
类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。
- 「200 OK」是最常⻅的成功状态码,表示⼀切正常。如果是⾮
HEAD
请求,服务器返回的响应头都会有 body 数据。 - 「204 No Content」也是常⻅的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
- 「206 Partial Content」是应⽤于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,⽽是其中的⼀部分,也是服务器处理成功的状态。
3xx
类状态码表示客户端请求的资源发⽣了变动,需要客户端⽤新的 URL 重新发送请求获取资源,也就是重定向。
- 「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改⽤新的 URL 再次访问。
- 「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要⽤另⼀个 URL 来访问。
301 和 302 都会在响应头⾥使⽤字段Location
,指明后续要跳转的 URL,浏览器会⾃动重定向新的URL。
- 「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲⽂件,也称缓存重定向,也就是告诉客户端可以继续使⽤缓存资源,⽤于缓存控制。
4xx
类状态码表示客户端发送的报⽂有误,服务器⽆法处理,也就是错误码的含义。
- 「400 Bad Request」表示客户端请求的报⽂有错误,但只是个笼统的错误。
- 「403 Forbidden」表示服务器禁⽌访问资源,并不是客户端的请求出错。
- 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以⽆法提供给客户端。
5xx
类状态码表示客户端请求报⽂正确,但是服务器处理时内部发⽣了错误,属于服务器端的错误码。
- 「500 Internal Server Error」与 400 类型,是个笼统通⽤的错误码,服务器发⽣了什么错误,我们并不知道。
- 「501 Not Implemented」表示客户端请求的功能还不⽀持,类似"即将开业,敬请期待"的意思。
- 「502 Bad Gateway」通常是服务器作为⽹关或代理时返回的错误码,表示服务器⾃身⼯作正常,访问后端服务器发⽣了错误。
- 「503 Service Unavailable」表示服务器当前很忙,暂时⽆法响应客户端,类似"⽹络服务正忙,请稍后重试"的意思。
HTTP常见字段有哪些?
Host字段:客户端发送请求时,⽤来指定服务器的域名。
Connection字段:Connection 字段最常⽤于客户端要求服务器使⽤「HTTP ⻓连接」机制,以便其他请求复⽤。
Content-Length字段:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据⻓度。
Content-Type字段:⽤于服务器回应时,告诉客户端,本次数据是什么格式。
Content-Encoding字段:说明数据的压缩⽅法。
Accept-Encoding字段:客户端在请求时,⽤该字段说明⾃⼰可以接受哪些压缩⽅法。
GET与POST
GET和POST有什么区别?
GET 的语义是请求获取指定的资源。 GET ⽅法是安全、幂等、可被缓存的。
POST 的语义是根据请求负荷(报⽂主体)对指定的资源做出处理,具体的处理⽅式视资源类型⽽不同。POST 不安全,不幂等,(⼤部分实现)不可缓存。
HTTP缓存技术
HTTP缓存有哪些实现方式?
对于⼀些具有重复性的 HTTP 请求,⽐如每次请求得到的数据都⼀样的,我们可以把这对「请求-响应」的数据都缓存在本地,那么下次就直接读取本地的数据,不必在通过⽹络获取服务器的响应了,这样的话HTTP/1.1 的性能肯定⾁眼可⻅的提升。
HTTP 缓存有两种实现⽅式,分别是强制缓存和协商缓存。
什么是强制缓存?
强缓存指的是只要浏览器判断缓存没有过期,则直接使⽤浏览器的本地缓存,决定是否使⽤缓存的主动性在于浏览器这边。
强缓存是利⽤下⾯这两个 HTTP 响应头部(Response Header)字段实现的,它们都⽤来表示资源在客户端缓存的有效期:
Cache-Control
,是一个相对时间;Expires
,是一个绝对时间。
如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话, Cache-Control 的优先级⾼于 Expires。
Cache-control 选项更多⼀些,设置更加精细,所以建议使⽤ Cache-Control 来实现强缓存。具体的实现流程如下:
- 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在Response头部加上Cache-Control,并在Cache-Control中设置了过期时间大小;
- 浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与Cache-Control中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;
- 服务器再次收到请求后,会再次更新Response头部的Cache-Control。
什么是协商缓存?
当我们在浏览器使⽤开发者⼯具的时候,你可能会看到过某些请求的响应码是304
,这个是告诉浏览器可以使⽤本地缓存的资源,通常这种通过服务端告知客户端是否可以使⽤缓存的⽅式被称为协商缓存。
协商缓存就是与服务端协商之后,通过协商结果来判断是否使用使用本地缓存。
协商缓存可以基于两种头部来实现。
第一种:请求头部中的If-Modified-Since
字段与响应头部中的Last-Modified
字段实现,这两个字段的意思是:
- 响应头部中的
Last-Modified
:标识这个响应资源的最后修改时间; - 请求头部中的
If-Modified-Since
:当资源过期了,发现响应头中具有Last-Modified声明,则再次发起请求的时候带上 Last-Modified 的时间,服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进⾏对⽐(Last-Modified),如果最后修改时间较新(⼤),说明资源⼜被改过,则返回最新资源, HTTP 200 OK;如果最后修改时间较旧(⼩),说明资源⽆新修改,响应HTTP 304 ⾛缓存。
第二种:请求头部中的If-None-Match字段与响应头部中的Etag
字段,这两个字段的意思是:
- 响应头部中的
Etag
:唯一标识响应资源; - 请求头部中的
If-None-Match
:当资源过期时,浏览器发现响应头里有Etag,则再次向服务器发起请求时,会将请求头If-None-Match值设置为Etag的值,服务器收到请求后进行比对,如果资源没有变化返回304,如果资源变化了返回200。
第⼀种实现⽅式是基于时间实现的,第⼆种实现⽅式是基于⼀个唯⼀标识实现的,相对来说后者可以更加准确地判断⽂件内容是否被修改,避免由于时间篡改导致的不可靠问题。
协商缓存这两个字段都需要配合强制缓存中 Cache-Control 字段来使⽤,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。
HTTP特性
HTTP/1.1的优点有哪些?
- 简单:HTTP 基本的报⽂格式就是 header + body ,头部信息也是 key-value 简单⽂本的形式, 易于理解,降低了学习和使⽤的⻔槛。
- 灵活和易于扩展:HTTP 协议⾥的各类请求⽅法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发⼈员⾃定义和扩充。
- 应用广泛和跨平台
HTTP/1.1 的缺点有哪些?
- 无状态双刃剑
- 明⽂传输双刃剑
- 不安全
HTTP/1.1的性能如何?
HTTP 协议是基于 TCP/IP,并且使⽤了「请求 - 应答」的通信模式。
- 长连接
- 管道网络传输
- 队头阻塞