TCP/IP面试常问合集,JavaWeb内容及HTTP协议

1. TCP/IP

1.1 传统的OSI(Open System Interconnection)参考模型是7层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。而TCP/IP是5层参考模型:应用层(HTTP、FTP等协议)、传输层(TCP、UDP协议)、网络层(IP协议)、数据链路层(ARP协议,IEEE802.3以太网协议)和物理层

1.2 TCP和UDP的区别:①TCP面向连接,传输数据需要先建立连接,UDP是不需要连接的;②TCP提供可靠的服务,保证数据无差错、不丢失,UDP则不保证可靠性;③TCP传输效率低,UDP传输效率高。

1.3 TCP怎么实现可靠的连接:①三次握手和四次挥手;②校验和、ACK应答、丢包重传、流量控制和拥塞控制等机制。

1.4 三次握手和四次挥手:①客户端发送同步序列号K(字符表示是SYN K);②服务端接受到该序列号,响应客户端序列号K+1的同时发送一个同步序列号M(ACK K+1, SYN M);③客户端接收到响应序列号K+1,同时响应服务端序列号M+1(ACK M+1)。为什么是三次呢?因为TCP是双向通道,要确保接受和发送都没有问题,只有当每次发送的序列号,得到响应才证明收发都没有问题,下面借用潜行前行公众号的一张图。那么挥手为什么是四次呢?因为客户端要关闭连接时,服务端的数据可能还没传输完成,所以先响应客户端,等到真正传输完成再发送指令FIN。

TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第1张图片     TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第2张图片

TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第3张图片         TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第4张图片 

1.5 丢包的超时重传:①由于网络问题,在客户端发送和接收过程中存在丢包情况;②发送时丢包,那么客户端在规定时间内就收不到服务端的响应,规定时间后会重传。③发送是成功的,但是服务端的响应没被客户端收到,规定时间后客户端仍会重传,但是服务端通过序列号(通过序列号可知目前接收的数据,以及下一次要接收的数据)发现该数据已接收,那么直接丢弃,然后继续响应上次的序列号。④如果在重传数据后,网络恢复,之前丢包的数据、响应送达客户端或服务端,这种情况怎么处理?这时通过序列号就可以很好的知道数据或者响应正不正确了,从而决定是丢弃还是处理。

TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第5张图片TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第6张图片

1.6 流量控制:接收方将自己缓冲区剩余容量大小放入TCP的“窗口大小”字段(滑动窗口),通过ACK报文响应给发送端,设定发送端发送数据的大小。

1.7 拥塞控制

1.7.1 慢启动和拥塞避免:①慢启动:发送端会维护一个拥塞窗口(缩写为cwnd),初始可发送的报文段是1,然后每成功传输一次数据,拥塞窗口大小翻倍(指数增长);②拥塞避免:当慢启动的cwnd大小达到ssthresh(拥塞避免阈值)后,为了避免拥塞,每成功传输一次数据,拥塞窗口加1(线性增长)。③每次遇到网络拥塞(貌似没有具体的判断依据,通过网络负载和吞吐量决定),就会将拥塞窗口大小设为1,同时将ssthresh设为网络拥塞时拥塞窗口大小的一半。还是借用潜行潜行公众号的一张图,如下。

TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第7张图片

1.7.2 快重传和快恢复:①快重传:由于某个数据段的丢包,发送方在等待响应时发送的其它报文,接收方都只会响应丢包前的那个响应序列号,发送方只要连续收到3个重复的响应序列号,立即从响应序列号后的数据开始重传,避免了在等待丢包数据的响应时重复发送没用的数据,避免网络拥塞。②快恢复:数据包的丢失可能是因为网络阻塞导致,所以这个时候应该重新进行慢启动和拥塞避免过程;但有可能又不是网络阻塞导致,所以不走慢启动,直接走拥塞避免过程,将ssthresh和cwnd都调整为当前cwnd的一半,然后cwnd按照拥塞避免原则线性增长。

1.8 拥塞窗口和滑动窗口的区别:相同点都是控制发送数据的大小;不同点是拥塞窗口根据网络情况限制数据的传输,而滑动窗口根据接收方的缓冲区大小限制数据的传输。

1.9 粘包和拆包问题:程序需要发送的数据大小和TCP单次所能发送的报文长度(Maximum Segment Size, MSS)是不一样的。当需要发送的数据大于MSS,需要将数据拆分多次发送,称之为拆包;当需要发送的数据小于MSS,会考虑将多个数据一起发送,称之为粘包。解决:①使用特殊字符作为数据的结尾或开头;

1.10 TCP四种计时器:①重传计时器:用于在规定时间(通常是60秒)内没有收到响应报文,进行数据重传。②坚持计时器:当流量控制的滑动窗口大小为零的时候启动,当时间到了(通常是60秒)就发送一个报文进行探测。③保活计时器:避免TCP连接没有关闭而长期空闲,每次收到数据,就将计时器复位,默认设置为2小时④时间等待计时器:连接关闭时,并不马上就关闭,因为接收方可能还在传输数据,时间大小一般是30秒到2分钟

1.11 四次挥手时,客户端收到服务端的FIN后,需要等待2个MSL(Max Segment LifeTime)再进入Closed状态,为什么?①保证客户端发送的ACK报文能够到达服务端,有这个2MSL时间,那么当服务端没有收到ACK报文时重传FIN+ACK报文,客户端还可以再发送ACK报文;②可以让本连接的报文段从网络中清空。

1.12 TCP四次挥手时,服务端主动断开和客户端主动断开的区别。因为主动断开的一方有2MSL时间的TIME_WAIT状态,则会存在一段时间有较多连接处于TIME_WAIT状态,Windows默认是4分钟,有损性能。解决:进行相关参数的配置:如更改MSL的时间,开启TIME_WAIT状态的TCP连接重用,开启TIME_WAIT状态的TCP连接回收。MSL时间是不是也可以处于某个范围。

1.13 TCP自身可以分段和重组(最大分段大小,MSS);UDP不会分段,由网络层分片和重组(最大传输单元,MTU)

2. JavaWeb内容及HTTP协议

2.1 在浏览器地址栏输入一个网址,经历了哪些步骤?①域名解析(浏览器DNS缓存--》操作系统自身DNS缓存--》读取host文件--》本地域名服务器...根域名服务器);②进行TCP3次握手建立连接;③浏览器发送http请求;④服务器响应http请求;⑤浏览器解析响应内容并渲染。

2.2 HTTP(HyperText Transfer Protocol)协议:超文本传输协议,浏览器和服务器之间传输数据的一种协议。

2.3 HTTP协议的无状态:每一次HTTP请求都是独立的,之间没有联系。这就会出现上一次账户登录,但下一次进行一些账户操作时,不知道是对哪个账户操作的情况。所以通过cookie和session机制来保持“状态”。

2.4 cookie:① 服务器通知客户端保存键值对数据的一种技术,客户端有cookie后每次向服务器发起请求都会带上cookie;② cookie的生命周期控制:正数表示指定秒数后过期;负数表示浏览器关闭cookie就过期,默认设置;零表示马上删除cookie。③cookie的有效范围:上级目录设置的cookie,下级目录可以获取;下级目录设置的cookie,上级目录获取不到。

2.5 session:①维护客户端和服务器之间关联的一种技术,在服务器端保存,底层是cookie技术,依赖于名为JSESSIONID的cookie;②刚开始客户端发起请求没有数据,然后服务器收到请求如果要创建session,会先判断有没有,没有就创建,并且通过set-cookie命令告诉客户端创建cookie对象,之后客户端发请求都会带上该cookie;服务端再通过该cookie的数据可以找到之前创建好的session对象。

2.6 常见状态码:200:请求成功;301:永久重定向,并且之后访问会直接使用得到的永久重定向地址,常见的是域名跳转;302:临时重定向;303:也是临时重定向,但以get方式发起重定向;304:发起的请求使用缓存的资源;307:临时重定向,和303一样,但是不会把post重定向请求改为get方式;400:客户端发起的请求有误;403:资源访问被拒绝;404:资源找不到;500:服务器内部发生错误。

2.7 304:首先判断资源是否过期,如果未过期,不会发起请求,直接使用浏览器缓存的资源,如果过期,那么向服务器发起请求。如果服务器资源文件有改动,那么返回新的资源文件以及200状态码;如果未改动,那么返回304状态码,然后浏览器使用之前缓存的资源文件。缓存过期有两种方式,cache-control和expires两种,cache-control优先级更高。资源文件改动判断:客户端第一次请求资源文件后,服务器端的响应头会带有last-modified字段;之后资源过期,客户端再发起请求,在请求头中会带有if-modified-since字段(就是第一次的last-modified字段内容),然后服务端会拿这个值和资源文件的最后修改时间对比,如果相等就返回304,让客户端使用过期的数据;如果不相等,重新响应新的资源文件并返回状态码200。

TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第8张图片

TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第9张图片

TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第10张图片

2.8 HTTP请求报文:①三部分:请求行、请求头和请求体,请求头和请求体之间有空行;②请求行:请求方式(GET还是POST等),请求资源路径,请求的协议和版本号。 

TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第11张图片

2.9 HTTP响应报文:①三部分:响应行、响应头和响应体,响应头和响应体之间有空行;②响应行:响应的协议和版本号,响应状态码,响应状态描述符。

TCP/IP面试常问合集,JavaWeb内容及HTTP协议_第12张图片

2.10 HTTP协议的1.0和1.1区别:1.1版本引入了长连接的概念,避免了1.0版本单个请求结束就关闭连接的弊端(建立连接和关闭连接耗费资源),但是时间长了之后,服务端会有较多连接。

2.11 HTTPS和HTTP的区别:HTTP是明文传输,HTTPS则在HTTP基础上加了SSL/TLS(Secure Socket Layer和Transport Layer Security),因此具备内容加密、身份认证、数据完整性(确保数据不被改变)的功能。

2.12 内容加密:分为非对称加密和对称加密。对称加密:加密和解密使用相同的算法,不够安全;非对称加密:加密和解密使用不同算法,得不到解密的私钥,就算有加密的公钥也解析不了非法拦截的用户数据。

2.13 身份认证:如果非法用户将自己私钥计算的签名和公钥发给客户,那么客户端验证会通过。为了避免这种情况,数字证书需要经由CA第三方机构统一管理,如果不被CA认证通过,那么认证失败。

2.14 数据完整性:发送者对响应报文进行hash运算,得到Digest,然后再用私钥加密,得到数字签名,最终接收者通过对比公钥解析数字签名得到的Digest和数据hash运算的Digest,从而确定数据是否被修改过。

2.15 HTTP1.1和HTTP2.0的区别:HTTP1.1虽然已经实现了管线化(不等待响应,可发送下一个请求),但是客户端还是按照请求的发送顺序接收响应。会出现线头阻塞情况(某个请求耗时会阻塞其它请求)。HTTP2.0通过多路复用,可以避免线头阻塞情况。

3. FTP协议

3.1 FTP仅基于TCP,不支持UDP。

3.2 FTP使用2个端口进行数据和指令的传输,然后分两种工作方式——PORT和PASV模式

3.3 PORT模式(服务端去连接客户端):①客户端通过端口 N 先和服务端的命令端口 21 建立TCP连接;②然后客户端发送命令 PORT N+1 到服务端;③服务端先响应 ACK,接着服务端从数据端口 20 发起一个到客户端 N+1端口的连接;④最后客户端从 N+1 端口响应一个 ACK。

3.4 PASV模式(客户端去连接服务端):①客户端通过端口 M 和服务端的命令端口21建立TCP连接;②然后客户端发送命令 PASV 到服务端;③服务端返回 PORT X;④客户端通过 M+1 端口向服务端的数据端口 X 发起连接,然后服务端向客户端返回一个 ACK。

3.5 客户端没有公网IP,所以一般客户端使用PASV方式,才能连接FTP服务器。

你可能感兴趣的:(JavaWeb,TCP/IP协议,HTTP协议,常见状态码)