关于java:网络篇朋友面试之TCPIP回去等通知吧

35次阅读

共计 5071 个字符,预计需要花费 13 分钟才能阅读完成。

前言

最近和一同学聊天,他想换工作,而后去面了一家大厂。过后,他在简历上写着精通 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 的滑动窗口与拥塞窗口

正文完
 0