由于最近在投简历,所以也是时候总结一下面试必备知识点了,以下是结合有关面经总结的一些经常会被HR问到的知识点和问题,做为面试复习用。

一. 网络7层架构

1.物理层:主要定义物理设备标准,如网线的接口类型,光纤的接口类型,各种传输介质的传输速率等。它的主要作用是传输比特流(就是由 1、0 转化为电流强弱来进行传输,到达目的地后在转化为 1、0,也就是我们常说的模数转换与数模转换)。这一层的数据叫比特。

2.数据链路层:主要将物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。这一层的数据通常叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。

3.网络层:主要将从下层接收到的数据进行IP地址(例如192.168.10.100)的封装与解封装。常把这一层数据叫做数据包。在这一层工作的设备是路由器。

4.传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天、视频等)。主要是将从下层接收的数据进行分段传输,到达目的地之后进行重组。常把这一层数据叫做段。

5.会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或接受会话请求。

6.表示层:主要是对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够能识别的东西(如图片、声音等))

7.应用层:主要是一些终端的应用,比如说FTP(各种文件的下载),WEB(IE浏览),QQ等(可以把它理解成我们在电脑屏幕上可以看到的东西,就是终端应用)。

二. TCP三次握手/四次握手

TCP 在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。

1. 数据包说明

1.源端口号:它(源主机IP地址)标识源主机的一个应用进程。

2.目的端口号:它(目的主机IP地址)标识目的主机的一个应用进程。这两个值 加上 IP 报头中的源主机 IP 地址和目的主机 IP 地址唯一确定一个 TCP 连接。

3.序列号seq:占4个字节(4 Byte = 32bit (位) 即1B = 8b),用来标识从 TCP 源端向 TCP 目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的序列号。并且这个第一个字节的序列号seq由本地随机产生。序列号是 32bit 的无符号数,当序号到达 2 的32次方 - 1 后 又从 0 开始。

4.确认号ack:表示发送确认的一端所期望收到的下一个顺序号。序列号表示报文段携带的第一个数据字节的编号;而确认号指的是期望接收到下一个数据字节的编号;因此,确认号应当是当前收到的报文段最后一个字节的编号加 1 。只有 ACK 标志为 1 时确认序号字段才有效。

5.TCP报头长度:给出报头中 32bit 字的数目,它实际上指明数据从哪里开始。

6.保留位:保留给将来使用,目前必须置为 0 。

7.控制位( control flags , 6 位):在 TCP 报头中有 6 个标志比特,它们中的多个可同时被设置为 1 。依次为:

字段 含义
URG 紧急指针是否有效,置为1。表示某一位需要被优先处理。
ACK 为 1 表示确认号有效,为 0 表示报文中不包含确认信息,忽略确认号字段。
PSH 为 1 表示是带有 PUSH 标志的数据,提示接收端应用程序立即从TCP缓冲区把数据读走。而不用等待缓冲区装满。
RST 用于复位由于主机崩溃或其他原因而出现错误的连接。
SYN 同步序号,为 1 表示连接请求,用于建立连接和使顺序号同步( synchronize )。
FIN 用于释放连接,为 1 表示发送方已经没有数据发送了,即关闭本方数据流。

8.窗口大小:数据字节数,表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。窗口大小是一个 16bit 字段,因而窗口大小大为 65535字节。

9.校验和:此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以及16 位字节进行计算所得。这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证。

10.紧急指针:只有当 URG 标志置 1 时紧急指针才有效。TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

11.选项:常见的可选字段是长报文大小,又称为 MSS(Maximum Segment Size) 。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN 标志的那个段)中指明这个选项, 它指明本端所能接收的大长度的报文段。

12.数据: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。

2. 三次握手

第一次:主机 A 发送位码为 SYN=1,随机产生 seq number=1234567 的数据包到服务器,主机 B 由SYN=1知道,A要求建立联机;

第二次:主机 B 收到请求后要确认联机信息,向 A 发送 ack number=(主机 A 的 seq+1),SYN=1,ACK=1,随机产生seq=7654321 的包 ;

第三次:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码 ACK是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ACK=1,主机B收到后确认seq值与ACK=1则连接建立成功。

【问题】为什么要进行握手三次?

建立连接开始时,C端想知道S端是否接收正常(是否准备好),以及自己是否发送正常,因此进行第一次握手;

接着S端收到信息之后,就告诉C端“我接收到了,你发送正常”,并且回答C端自己已经准备好了,然后开始询问C端是否也已经准备好,因此进行第二次握手;

接着C端收到信息之后,知道了S端准备好了,并且发送和接收信息正常,自己发送和接收也正常,然后就告诉S端“我也准备好了”,因此进行第三次握手;

S端收到信息之后,三次握手结束,连接建立成功。

因此三次握手是为了确保双方都知道对方发送和接收信息均正常,连接才建立成功。例如知乎上一个打电话的例子:“喂,你听得到吗?”;“我听得到呀,你听得到我吗?”;“我能听到你,今天balabala……”。

但是如果只进行两次握手,也就是说只要server发出确认,新的连接就建立了。但是C端并不知道S端是否准备好,也不知道S端发送了什么样的序列号,因此C端就认为连接建立未成功,就忽略S端发送来的所有数据信息,只等待连接确认应答分组。导致S端和C端无法进行数据传送。

3.四次挥手

TCP 建立连接要进行三次握手,而断开连接要进行四次。这是由于 TCP 的半关闭造成的。因为 TCP 连接是全双工的(即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭。这个单方向的关闭就叫半关闭。当一方完成它的数据发送任务,就发送一个FIN来向另一方通告将要终止这个方向的连接。因此当Client端发送FIN报文后,需要等待Server端所有的报文都发送完了,Server端才能发送FIN报文。

第一次:关闭客户端到服务器的连接:首先客户端 A 发送一个 FIN,用来关闭客户到服务器的数据传送, 然后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u ;

第二次:服务器收到这个FIN,它发回一个ACK,确认号ack为收到的序号加1;

第三次:关闭服务器到客户端的连接:也是发送一个FIN给客户端;

第四次: 客户端收到FIN后,并发回一个 ACK报文确认,并将确认序号seq设置为收到序号加1。

首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

详细过程

主机A发送FIN后,进入终止等待状态, 服务器B 收到主机 A连接释放报文段后,就立即给主机A发送确认,然后服务器B就进入close-wait 状态,此时TCP服务器进程就通知高层应用进程,因而从A到 B的连接就释放了。此时是“半关闭”状态。即A不可以发送给 B,但是B 可以发送给A。此时,若B 没有数据报要发送给A了,其应用进程就通知TCP释 放连接,然后发送给A连接释放报文段,并等待确认。A发送确认后,进入time-wait,注 意,此时TCP连接还没有释放掉,然后经过时间等待计时器设置的 2MSL后,A才进入到 close状态。

【问题】为什么是需要2MSL时间?

2MSL是2倍的MSL(Maximum Segment Lifetime)。MSL是最大报文生存时间,是任何报文在网络上的存在的最长时间,超过这个时间报文将被丢弃。《TCP/IP详解》中是这样描述的:MSL是任何报文段被丢弃前在网络内的最长时间

C端收到来自S端发送的FIN报文之后需要等待2MSL,是因为可能C端发送的最后一个ACK丢失了,如果S端没有收到ACK,将不断重复发送FIN片段。所以C端不能立即关闭,它必须确认S端接收到了该ACK。C端在发送出ACK之后进入到TIME_WAIT状态。C端会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么C会重发ACK并再次等待2MSL。如果直到2MSL,C都没有再次收到FIN,那么C端推断ACK已经被成功接收,则结束TCP连接。

【问题】如果已经建立了连接,但是客户端突然出现故障了怎么办?

这个问题是在一个优秀博主的博客上看到的,感觉也很有价值,所以就借鉴过来了。

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

三. TCP流量控制和TCP拥塞控制

TCP流量控制

流量控制是为了控制发送方发送速率不要太快,防止在接收方接受的时候出现数据丢失的情况。其主要利用了滑动窗口的方式在实现流量控制,由于TCP是双工协议,所以会话双方都会维系发送窗口和接受窗口。

从图中,滑动窗口的大小随着发送数据的大小而改变,TCP三次流量控制分别是,第一次窗口大小由400减到300,第二次减到100,第三次减到0。TCP连接的一方如果收到零窗口通知,就会启动坚持计时器。若坚持计时器的时间到期,就会发送一个零窗口控测报文段,收到报文段的一方就重新设置坚持计时器。

TCP拥塞控制

在TCP数据传输过程中可能会出现很多数据一下子涌入网络中,会使整个网络拥塞不堪,导致整个网络资源供应不足,整个性能下降,出现丢失数据严重的情况,从而使网络吞吐量极速下降;而如果采用一次性只传输一小段报文段数目,一直维持这种低速数据传输的话整个网络传输效率也是一个严重的问题;因此,引入了TCP拥塞控制的概念。

TCP的拥塞控制就是在这两者之间进行一种权衡的方案,既能保证网络传输过程中数据的完整性、可靠性,又能稳定的提升网络传输效率,提高网络吞吐量,从而平衡整个网络性能。

1.慢开始。因为刚开始的时候并不清楚网络状况,因此需要试探,将拥塞窗口cwnd逐渐增长,并且增长速度呈指数倍。另外,为了防止拥塞窗口过大引起网络拥塞,我们需要设置一个慢开始的初始门限值ssthreth;当cwnd < ssthreth时,使用慢开始算法;当cwnd > ssthrerth时,使用拥塞控制算法;如果两者相等,两个都可以使用。

慢开始的“慢”并不是指CWND增长速率慢而是说在TCP开始发送报文时,先设置CWND=1,使发送端开始时只发送一个报文段进行探测。

2.拥塞避免。当拥塞窗口到达初始门限值时,为了防止网络过早出现拥塞,cwnd就不能呈指数倍增长了。此时需要让拥塞窗口缓慢增大,即每经过一个往返时间RTT就使cwnd+1,这种线性增长的速率慢很多。

3.快速重传。若发送方判断出网络拥塞(即连续收到3个重复的ack数据信息或传送超时,即TCP重传定时器溢出),那么发送方不用等到重传计时到期,而是马上重新传递没被接受方确认的报文段。

此时不论是在慢开始还是拥塞控制阶段,都要把慢开始门限值设置为出现拥塞时发送端窗口大小的一半,但不能小于2。然后把cwnd重新置为1,执行慢开始算法。这样做是为了减少发送到网络中的分组数,使得发生拥塞的路由器能够有时间能把队列中积压的分组处理掉。

4.快速恢复。将慢开始门限值减半,“乘法减小”,然后重新开始慢开始,拥塞避免,缓慢的增大拥塞窗口。

四. HTTP原理

HTTP是一个无状态的协议。无状态是指客户机(WEB浏览器)和服务器之间不需要建立持久的连接,这就意味着当一个客户端向服务器端发送请求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息。下一次客户端向同样的服务器发送请求时需要重新建立连接。

HTTP遵循请求(Requests)/应答(Response)模型。客户机(浏览器)向服务器发送请求,服务器处理请求并返回适当的应答。所有 HTTP连接都被构造成一套请求和应答。

客服端每次请求会经过:客户端的应用层(http协议)-->  客户端的传输层(tcp或udp协议) -->客户端的网络层(ip协议) --> 客户端的链路层(网卡,路由器等) -->  ------------------经过dns解析,穿越多个isp(互联网服务提供商,移动,联通,电信等),各种数据交换,找到了服务器------------------- 服务器的链路层  -->服务器的网络层  -->服务器的传输层  -->服务器的应用层。 这个请求完成了。

服务器的响应则跟上面的流程相反,倒过来就可以了。

推荐两个HTTP协议的博客,个人感觉写的很好:HTTP协议概览完整的HTTP请求

HTTP传输流程

1.地址解析:使用域名系统DNS解析域名,根据域名找到服务器的IP地址。

2.封装HTTP请求数据包

3.封装成TCP包并建立连接:封装成TCP包,建立TCP连接(TCP的三次握手)。

4.客户机发送请求命令:建立连接后,客户机会发送一个请求给服务器;请求报文的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符,客户机信息和内容。

HTTP请求报文和响应报文的格式:

起始行:如 GET / HTTP/1.0 (请求的方法  请求的URL 请求所使用的协议)
头部信息:User-Agent  Host等成对出现的值
主体

常见的请求方法是post和get请求。使用get请求时,参数就直接附加在URL后,大小有限制且只能是字符串;而post请求存在请求体里面,有足够大的控件存储内容;

关于URL、URI、URN:URI   Uniform Resource Identifier 统一资源标识符,URL  Uniform Resource Locator 统一资源定位符,URN  Uniform Resource Name 统一资源名称。

请求的协议有以下几种:http/0.9: stateless、http/1.0: MIME, keep-alive (保持连接), 缓存、http/1.1: 更多的请求方法,更精细的缓存控制,持久连接(persistent connection) 比较常用

举个报文头部信息的栗子,其中的Cookie用于服务器端识别是否是同一个客户端。

5.服务器响应:服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容(text/html)。

状态码按大的分一共有以下5类:(后面有所有HTTP的状态码截图)

1xx 指示信息--表示请求已接收,继续处理。
2xx 成功--表示请求已被成功接收、理解、接受。
3xx 重定向--要完成请求必须进行更进一步的操作。
4xx 客户端错误--请求有语法错误或请求无法实现。
5xx 服务器端错误--服务器未能实现合法的请求。

举个响应报文头部信息的栗子:

6.服务器关闭TCP连接:一般情况下,一旦 Web 服务器向浏览器发送了请求数据,它就要关闭 TCP 连 接,然后如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive,TCP 连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求 建立新连接所需的时间,还节约了网络带宽。

HTTP状态码(表格来自于:http://tools.jb51.net/table/http_status_code

消息响应
100 Continue 继续。客户端应继续其请求
101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
成功响应
200 OK 请求成功。一般用于GET与POST请求
201 Created 已创建。成功请求并创建了新的资源
202 Accepted 已接受。已经接受请求,但未处理完成
203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206 Partial Content 部分内容。服务器成功处理了部分GET请求
重定向
300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303 See Other 查看其它地址。与301类似。使用GET和POST请求查看
304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305 Use Proxy 使用***。所请求的资源必须通过***访问
306 Unused 已经被废弃的HTTP状态码
307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向
客户端错误
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求
407 Proxy Authentication Required 请求要求***的身份认证,与401类似,但请求者应当使用***进行授权
408 Request Time-out 服务器等待客户端发送的请求时间过长,超时
409 Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
412 Precondition Failed 客户端请求信息的先决条件错误
413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理
415 Unsupported Media Type 服务器无法处理请求附带的媒体格式
416 Requested range not satisfiable 客户端请求的范围无效
417 Expectation Failed 服务器无法满足Expect的请求头信息
服务器错误
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 充当网关或***的服务器,从远端服务器接收到了一个无效的请求
503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或***的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理

【问题】HTTP/2.0有哪些新增的特点

1.二进制协议:http2.0协议整个都是二进制数据,协议头和数据体都是二进制协议。协议头和数据体,都被称为“帧”(frame):头信息帧和数据帧。

2.多工:多路复用允许多送多条响应消息

3.HTTP2支持服务器推送

4.头信息压缩机制,提高速度

【问题】get和post的区别?

1.get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
2.get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用"?"连接,而各个变量之间使用"&"连接,如EditPosts.jsp?name=test1&id=123456;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
3.get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据,上传文件通常要使用post方式; 
4.GET方式没有POST方式安全,使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据应使用post;
5.get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。

【问题】什么是长连接、短连接

首先要知道HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
1.HTTP/1.0,默认是短连接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就“恩断义绝”,不保留任何连接信息。
2.HTTP/1.1后,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:Connection:keep-alive 。
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

五. HTTPS原理

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP通道,简单讲是 HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。其所用的端口号是443。过程大致如下:

1.建立连接获取证书: SSL客户端通过TCP和服务器建立连接之后(443端口),并且在一般的tcp连接协商(握手)过程中请求证书。即客户端发出一个消息给服务器,这个消息里面包含了自己可实现的算法列表和其它一些需要的消息,SSL的服务器端会回应一个数据包,这里面确定了这次通信所需要的算法,然后服务器向客户端返回证书。(证书里面包含了服务器信息:域名。申请证书的公司,公共秘钥)。

2.证书验证:Client在收到服务器返回的证书后,判断签发这个证书的公共签发机构,并使用这个机构的公共秘钥确认签名是否有效,客户端还会确保证书中列出的域名就是它正在连接的域名。

3.数据加密和传输:如果确认证书有效,那么生成对称秘钥并使用服务器的公共秘钥进行加密。然后发送给服务器,服务器使用它的私钥对它进行解密,这样两台计算机可以开始进行对称加密进行通信。

六. cookie和session

       cookie存在于客户端(浏览器)中,是web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务器存储 cookie。以后浏览器再给特定的web服务器发送请求时,同时会发送所有为该服务器存储的cookie。 
       session的主要信息存在于服务器,在客户端只存放一个sessionid(基于cookie的),每次请求,客户端都会自动把sessionid发送到服务端去(因为是通过cookie保存的sessionid,每次发送请求,客户端会自动发送cookie到服务端),服务端根据sessionid去session里获取信息,查找该客户端是否存在,若不存在会把此时的sessionid存进session里,以便下一次客户端发送请求,做相应的操作。

【问题】cookie和session的区别

1.无论客户端做怎样的设置,session都能够正常工作。当客户端禁用cookie时将无法使用cookie。 
2.在存储的数据量方面:session能够存储任意的java对象,cookie只能存储String类型的对象。