前言
最近和一同学聊天,他想换工作,而后去面了一家大厂。过后,他在简历上写着精通TCP/IP,本着对TCP协定稍有理解,面试官也不会深问的想法,就写了精通二字。没想到,粗心了
github地址,感激star
关注公众号,一起交换,微信搜一搜: 潜行前行
收场
敌人约的是十点半的面试,提前了十分钟到,而后宁静地坐在沙发期待,顺便回顾下之前看的材料。快到十点半时,一个高瘦,衣着格子衫的女子推开门而进,说了句“你好,咱们来开始面试吧!”,敌人不失礼貌地笑着回了句“行”
面试官:看你简历说精通TCP和IP,那咱们来探讨下网络模型和TCP、IP协定,讲下你的了解先
- 敌人(怎么一上来就问TCP,不按套路出牌啊,不该问问java根底吗?不过惯例题,我还行)
- 敌人:网络模型个别分七层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。应用层的协定包含HTTP、FTP、SMTP,而TCP属于传输层,IP协定则属于网络层
- 敌人:TCP/IP网络模型档次由上到下,层层包装,每一层都对应不同的协定解析,我来画个图
面试官:看你画的图,TCP有本人的首部构造,这都有哪些字段,最好说说它们的作用
- 敌人(什么鬼!当我百度词典,这怎么记得住?等等,昨天晚上如同看过,有印象)
- 敌人:持续画个图,直观点
- 敌人:TCP首部构造先是16位的源端口号和指标端口号、接着是32位的序列号和确认号。再上面就是4bit的头部长度和6个bit的保留位及6bit的标记位
- 敌人:16位的属性则有窗口大小(管制发送窗口),测验和(校验数据段是否未被批改)及紧急指针。最初是选项,其长度由头部长度决定
- 敌人:具体说下序列号,它是TCP报文段的一数字编号,为保障TCP牢靠连贯,每一个发送的数据段都要加上序列号。建设连贯时,两端都会随机生成一个初始序列号。而确认号而是和序列号配合应用的,应答某次申请时,则返回一个确认号,它的值等于对方申请序列号加1
- 敌人:而6个标记位别离是,URG:这是条紧急信息,ACK:应答音讯,PSH:缓冲区尚未填满,RST:重置连贯,SYN:建设连贯音讯标记,FIN:连贯敞开告诉信息
- 敌人:窗口大小是接收端用来管制发送端的滑动窗口大小
面试官:那TCP和UDP有什么区别
- 敌人(松了一口气)
- 敌人:1)连贯方面:TCP面向连贯。UDP是无连贯的,发送数据之前不须要建设连贯
- 敌人:2)平安方面:TCP提供牢靠的服务,保障传送的数据,无差错,不失落,不反复,且按序达到。UDP则是尽最大致力交付,不保障牢靠交付
- 敌人:3)传输效率:TCP传输效率绝对较低,UDP传输效率高
面试官:方才你说TCP是牢靠的连贯,它是怎么实现的
- 敌人:TCP的连贯是基于三次握手,而断开则是四次挥手
- 敌人:为了保障数据不失落及谬误(可靠性),它有报文校验、ACK应答、超时重传(发送方)、失序数据重传(接管方)、抛弃反复数据、流量管制(滑动窗口)和拥塞管制等机制
面试官:具体说一说三次握手和四次挥手机制
- 敌人(又是惯例题,晒晒水啦)
- 敌人:TCP是牢靠的双向通道,所以须要三次握手和四次挥手,我来画个图
- 三次握手
- 四次挥手
- 敌人:提前抢答下,敞开连贯时须要四次挥手,比建设时多一次,是因为被动敞开端或者还有数据没被送出去,不能像握手时一样,第二次握手既是发动握手也是响应握手
面试官:如果没有三次握手会有什么问题呢
- 敌人:如果只有两次握手,client发连贯申请后不会再ACK服务端的SYN
- 敌人:此时若客户端因为本身起因判断建设连贯失败,可能会反复建设TCP连贯,而服务端却会认为那些被client抛弃的TCP还是无效,会白白浪费资源
面试官:TIME_WAIT和CLOSE_WAIT的区别在哪
- 敌人:CLOSE_WAIT是被动敞开造成的;当对方close socket而发送FIN报文过去时,回应ACK之后进入CLOSE_WAIT状态。随后查看是否存在未传输数据,如果没有则发动第三次挥手,发送FIN报文给对方,进入LAST_ACK状态并期待对方ACK报文到来
- 敌人:TIME_WAIT是被动敞开连贯形式造成的;处于FIN_WAIT_2状态时,收到对方FIN报文后进入TIME_WAIT状态;之后再期待两个MSL(Maximum Segment Lifetime:报文最大生存工夫)
面试官:TIME_WAIT的作用呢,还有为啥状态工夫要放弃两个MSL
- 敌人(这问得太深了吧,老哥。还好昨天偷偷补课了)
- 敌人:1)TIME_WAIT的作用是为了保障最初一次挥手的ACK报文能送达给对方,如果ACK失落,对方会超时重传FIN,被动敞开端会再次响应ACK过来;如果没有TIME_WAIT状态,间接敞开,对方重传的FIN报文则被响应一个RST报文,此RST会被动敞开端被解析成谬误
- 敌人:2)存在两个连贯,第一个连贯失常敞开,第二雷同的连贯紧接着建设;如果第一个连贯的迷路报文到来,则会烦扰第二连贯,期待两个MSL则能够让上次连贯的报文数据消失在网络后
面试官:方才你还有提到拥塞管制,TCP协定用什么形式去解决拥塞的
- 敌人:第一形式是慢启动和拥塞防止
- 敌人:1)慢启动,TCP发送端会保护一个拥塞窗口(congestionwindow),简称为cwnd。拥塞窗口初始为1个报文段,每通过一次RTT(数据齐全发送完到确认的工夫),窗口大小翻倍(指数增长,只是后期慢)
- 敌人:2)拥塞防止,它思路是让拥塞窗口cwnd迟缓增大,发送方的cwnd达到阀值ssthresh(初始值由零碎决定的)之后,每通过一个RTT就把拥塞窗口加一,而不是加倍(收到两个或四个确认,都是cwnd+1),cwnd呈线性减少(加法增大)
- 敌人:(画个图好解析)
- 敌人:如果遇到网络拥塞,拥塞窗口阀值ssthresh减半,cwnd设置为1,从新进入慢启动阶段
面试官:那拥塞管制还有其余什么形式呢
- 敌人:快重传和快复原
- 敌人:1)快重传是当接管方收到了一个失序的报文,则立马报告给发送方,连忙重传
- 敌人:如果接管方M1收到了,M2没有收到,之后的M3、M4、M5又发送了,此时接管方一共间断给发送方反馈了3个M1确认报文。那么快重传规定,发送方只有间断收到3个反复确认,立刻重传对方发来的M2(反复确认报文的后一个报文)
- 敌人:2)快复原
- 敌人:当发送方间断收到三个反复确认,ssthresh减半;因为发送方可能认为网络当初没有拥塞,因而与慢启动不同,把cwnd值设置为ssthresh减半之后的值,而后执行拥塞防止算法,cwnd线性增大
- 敌人:(再来一图)
面试官:晓得滑动窗口不,客户端和服务端管制滑动窗口的过程是怎么的
- 敌人:接收端将本人能够接管的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK报文来告诉发送端,滑动窗口是接收端用来管制发送端发送数据的大小,从而达到流量管制
- 敌人:其实发送方的窗口下限,是取值拥塞窗口和滑动窗口两者的最小值
面试官:那你晓得滑动窗口和拥塞窗口有什么区别不
- 敌人:相同点都是管制丢包景象,实现机制都是让发送方发得慢一点
- 敌人:不同点在于管制的对象不同
- 敌人:1)流量管制的对象是接管方,怕发送方发的太快,使得接管方来不及解决
- 敌人:2)拥塞管制的对象是网络,怕发送方发的太快,造成网络拥塞,使得网络来不及解决
面试官:TCP的粘包和拆包问题,你怎么看
- 敌人:程序须要发送的数据大小和TCP报文段能发送MSS(Maximum Segment Size,最大报文长度)是不一样的
- 敌人:大于MSS时,而须要把程序数据拆分为多个TCP报文段,称之为拆包;小于时,则会思考合并多个程序数据为一个TCP报文段,则是粘包;其中MSS = TCP报文段长度-TCP首部长度
- 敌人:在IP协定层或者链路层、物理层,都存在拆包、粘包景象
面试官:那解决粘包和拆包的办法都有哪些?
- 敌人:1)在数据尾部减少特殊字符进行宰割
- 敌人:2)将数据定为固定大小
- 敌人:3)将数据分为两局部,一部分是头部,一部分是内容体;其中头部构造大小固定,且有一个字段申明内容体的大小
面试官:SYN Flood理解吗
- 敌人:SYN Flood 伪造 SYN 报文向服务器发动连贯,服务器在收到报文后用 SYN_ACK 应答,此应答收回去后,不会收到 ACK 报文,造成一个半连贯
- 敌人:若攻击者发送大量这样的报文,会在被攻打主机上呈现大量的半连贯,耗尽其资源,使失常的用户无法访问,直到半连贯超时
面试官:对TCP的把握挺不错的,上面问下HTTP的常识。你晓得一次HTTP申请,程序个别经验了哪几个步骤?
- 敌人:1)解析域名 -> 2)发动TCP三次握手,建设连贯 -> 3)基于TCP发动HTTP申请 -> 4)服务器响应HTTP申请,并返回数据 -> 5)客户端解析返回数据
面试官:HTTP有哪几种响应状态码,列举几个你相熟的
敌人:大略有以下几种
* 200:示意胜利失常申请* 400:语义有误,个别是申请格局不对* 401:需要用户验证权限,个别是证书token没通过认证* 403:回绝提供服务* 404:资源不存在* 500:服务器谬误* 503:服务器长期保护,过载;可复原
面试官:不错,再考考你,session和cookie有什么区别
- 敌人:1)存储地位不同,cookie是保留在客户端的数据;session的数据寄存在服务器上
- 敌人:2)存储容量不同,单个cookie保留的数据小,一个站点最多保留20个Cookie;对于session来说并没有下限
- 敌人:3)存储形式不同,cookie中只能保存ASCII字符串;session中可能存储任何类型的数据
- 敌人:4)隐衷策略不同,cookie对客户端是可见的;session存储在服务器上,对客户端是通明对
- 敌人:5)有效期上不同,cookie能够长期有效存在;session依赖于名为JSESSIONID的cookie,过期工夫默认为-1,只需敞开窗口该session就会生效
- 敌人:6)跨域反对上不同,cookie反对跨域名拜访;session不反对跨域名拜访
面试官:不错,那你理解什么是HTTP分块传送吗
- 敌人:分块传送是HTTP的一种传输机制,容许服务端发送给客户端的数据分成多个局部,该协定在HTTP/1.1提供
面试官:HTTP分块传送有什么益处
- 敌人:HTTP分块传输编码容许服务器为动静生成的内容维持HTTP长久连贯
- 敌人:分块传输编码容许服务器在最初发送音讯头字段。对于那些头字段值在内容被生成之前无奈晓得的情景十分重要,例如音讯的内容要应用散列进行签名
敌人:HTTP服务器有时应用压缩 (gzip或deflate)以缩短传输破费的工夫。分块传输编码能够用来分隔压缩对象的多个局部。在这种状况下,块不是别离压缩的,而是整个负载进行压缩。分块编码有利于一边进行压缩一边发送数据
面试官:HTTP的长连贯你怎么了解
- 敌人:长连贯是指客户端和服务建设TCP连贯后,它们之间的连贯会继续存在,不会因为一次HTTP申请后敞开,后续的申请也是用这个连贯
- 敌人:长连贯能够省去TCP的建设和敞开操作,对于频繁申请的客户端适宜应用长连贯,然而留神歹意的长连贯导致服务受损(倡议外部服务之间应用)
面试官:HTTP是平安的吗?怎么做到平安的HTTP协定传输
- 敌人:并非平安,HTTP传输的数据都是明文的,容易被第三方截取;要做平安传输数据,能够应用HTTP的升级版HTTPS协定
面试官:HTTPS和HTTP的区别,你是怎么了解的
- 敌人:1)http协定的连贯是无状态的,明文传输
- 敌人:2)HTTPS则是由SSL/TLS+HTTP协定构建的有加密传输、身份认证的网络协议
面试官:SSL/TLS是什么,HTTPS的安全性是怎么实现的?
- 敌人:SSL(Secure Socket Layer 安全套接层)是基于HTTPS下的一个协定加密层,保障数据私密性。TLS(Transport Layer Security)则是升级版的SSL
- 敌人:https在http根底加了一层平安认证及加密层TLS或者SSL,它首先会通过平安层进行ca证书认证,正确获取服务端的公钥
- 敌人:接着客户端会通过公钥和服务端确认一种加密算法,前面的数据则能够应用该加密算法对数据进行加密
面试官:你能具体说下TLS/SSL的认证过程不...(此时面试官放在桌面的手机触动了起来,他下意识看了看手机,进展下)
敌人面试临时告一段落(下回持续)
欢送指注释中谬误
参考文章
- 腾讯面试HTTP与TCP/IP20连问,你能答出多少
- 什么是TCP/IP协定?
- 太厉害了,终于有人能把TCP/IP协定讲的明明白白了!
- TCP的滑动窗口与拥塞窗口