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。
1.5 丢包的超时重传:①由于网络问题,在客户端发送和接收过程中存在丢包情况;②发送时丢包,那么客户端在规定时间内就收不到服务端的响应,规定时间后会重传。③发送是成功的,但是服务端的响应没被客户端收到,规定时间后客户端仍会重传,但是服务端通过序列号(通过序列号可知目前接收的数据,以及下一次要接收的数据)发现该数据已接收,那么直接丢弃,然后继续响应上次的序列号。④如果在重传数据后,网络恢复,之前丢包的数据、响应送达客户端或服务端,这种情况怎么处理?这时通过序列号就可以很好的知道数据或者响应正不正确了,从而决定是丢弃还是处理。
1.6 流量控制:接收方将自己缓冲区剩余容量大小放入TCP的“窗口大小”字段(滑动窗口),通过ACK报文响应给发送端,设定发送端发送数据的大小。
1.7 拥塞控制
1.7.1 慢启动和拥塞避免:①慢启动:发送端会维护一个拥塞窗口(缩写为cwnd),初始可发送的报文段是1,然后每成功传输一次数据,拥塞窗口大小翻倍(指数增长);②拥塞避免:当慢启动的cwnd大小达到ssthresh(拥塞避免阈值)后,为了避免拥塞,每成功传输一次数据,拥塞窗口加1(线性增长)。③每次遇到网络拥塞(貌似没有具体的判断依据,通过网络负载和吞吐量决定),就会将拥塞窗口大小设为1,同时将ssthresh设为网络拥塞时拥塞窗口大小的一半。还是借用潜行潜行公众号的一张图,如下。
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。
2.8 HTTP请求报文:①三部分:请求行、请求头和请求体,请求头和请求体之间有空行;②请求行:请求方式(GET还是POST等),请求资源路径,请求的协议和版本号。
2.9 HTTP响应报文:①三部分:响应行、响应头和响应体,响应头和响应体之间有空行;②响应行:响应的协议和版本号,响应状态码,响应状态描述符。
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服务器。
TCP/IP面试常问合集,JavaWeb内容及HTTP协议相关推荐
- TCP/IP面试常考题目
TCP/IP(附解析) 1. OSI与TCP/IP各层的结构与功能,都有哪些协议. 2. TCP与UDP的区别. 3. TCP报文结构. 4. TCP的三次握手与四次挥手过程,各个状态名称与含义,TI ...
- 测试主管面试必问合集:get 与 post 的区别
疑问收录解答 01 GET与POST的区别 (1)GET请求用来获取数据资源,POST请求用来创建.发送数据资源.(详见下方补充说明) (2)GET无请求主体,POST有请求主体. (3)GET有幂等 ...
- 网络基础 TCP/IP协议面试常问知识点
网络基础 TCP/IP协议面试常问知识点 ****************** 如有侵权请提示删除 ********************* 1.网络包的组成: 报头/起始帧分界符--MAC头部-- ...
- 给大家提供一些面试常问的问题
给大家提供一些面试常问的问题 1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以 ...
- Java面试常问计算机网络问题
转载自 Java面试常问计算机网络问题 一.GET 和 POST 的区别 GET请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:/test/demo_form.asp?na ...
- 计算机考研复试面试常问问题 计算机网络篇(上)
计算机考研复试面试常问问题 计算机网络篇(上) 在复习过程中,我用心查阅并整理了在考研复试面试中可能问到的大部分问题,并分点整理了答案,可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看,效率更 ...
- Linux C工程师面试常问技术要点
前言 最近在考虑跳槽,整理一下面试常问的东西,在给自己复习的同时也希望给需要面试的朋友有帮助~ 系统编程常问技术点 物理内存+虚拟内存 内存分区(栈+堆) 进程+线程 锁 分片 中断+系统调用 同步+ ...
- 数据库面试常问——for考研复试面试
关于数据库的一些面试常问问题 前言: 本人22考研党,已上岸,发一些复试准备整理的资料作为对考研准备的一个收尾.由于近几年基本都是线上复试,线上的话会更加注重概念的考察,本人在复试准备期间搜集了面试题 ...
- 计算机考研复试面试常问问题 计算机网络篇(下)
计算机考研复试面试常问问题 计算机网络篇(下) 在复习过程中,我用心查阅并整理了在考研复试面试中可能问到的大部分问题,并分点整理了答案,可以直接理解背诵并加上自己的语言润色!极力推荐打印下来看,效率更 ...
最新文章
- 工作5年左右的程序员如何在职业瓶颈期内快速提升自己的身价?提升后如何有效变现自己的高质量技能?...
- linux查看进程占用pcu,Linux运维:如何使用ss代替netstat命令
- 在JUnit测试中使用Builder模式
- Docker常用命令、超实用、讲解清晰明了(rm、stop、start、kill、logs、diff、top、cp、restart ...)
- windows os x linux比较,对比测试:Ubuntu 11.04 vs Win7 vs OS X 10.7
- C#通用类库--短信猫操作类1(原始AT命令)
- access 报表中序号自动_Access中自动编号的字段ID如何让它重新从初始值1开始编号...
- JavaScript学习 第三课(三)
- 11. Flash助手推荐的弹窗广告怎么删除
- arm9有多少个寄存器
- apk自行修改后的操作(软件安装不了,安了打不开,闪退)
- Centos桌面版无法打开Chrome浏览器
- 绕过AMSI详细指南:如何利用DLL hijack轻松绕过AMSI
- 微信小程序 | 一文总结全部营销抽奖功能
- 上传声音 微信小程序_图文详解微信小程序中调用录音功能和音频播放的方法...
- SyntaxError: (unicode error) ‘utf-8‘ codec can‘t decode byte 0xca in position 0: invalid continuati
- CC2530—MQ-2气敏式烟雾传感器
- Mybatis源码研究序
- 【大数据】Hadoop—— 三大核心组件理论入门 | 完全分布式集群搭建 | 入门项目实战
- 单价多少元一千克在c语言中怎么表示_小学三年级数学《克和千克的认识》说课稿范文...