开场java
朋友约的是十点半的面试,提早了十分钟到,而后安静地坐在沙发等待,顺便回忆下以前看的资料。快到十点半时,一个高瘦,穿着格子衫的男子推开门而进,说了句“你好,咱们来开始面试吧!”,朋友不失礼貌地笑着回了句“行”面试
若是你们在学习Java过程当中遇到什么问题,或者缺少相关的Java学习资料,可查看右侧公告栏获取,有问题随问随答,还有我这段时间整理的一些Java学习手册,面试题,开发工具,PDF文档书籍教程,须要的话均可以避免费分享给你们。算法
朋友(怎么一上来就问TCP,不按套路出牌啊,不应问问java基础吗?不过常规题,我还行)跨域
朋友:网络模型通常分七层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。应用层的协议包括HTTP、FTP、SMTP,而TCP属于传输层,IP协议则属于网络层安全
朋友:TCP/IP网络模型层次由上到下,层层包装,每一层都对应不一样的协议解析,我来画个图服务器
朋友(什么鬼!当我百度词典,这怎么记得住?等等,昨天晚上好像看过,有印象)cookie
朋友:继续画个图,直观点网络
朋友:TCP首部结构先是16位的源端口号和目标端口号、接着是32位的序列号和确认号。再下面就是4bit的头部长度和6个bit的保留位及6bit的标志位session
朋友:16位的属性则有窗口大小(控制发送窗口),检验和(校验数据段是否未被修改)及紧急指针。最后是选项,其长度由头部长度决定socket
朋友:详细说下序列号,它是TCP报文段的一数字编号,为保证TCP可靠链接,每个发送的数据段都要加上序列号。创建链接时,两端都会随机生成一个初始序列号。而确认号而是和序列号配合使用的,应答某次请求时,则返回一个确认号,它的值等于对方请求序列号加1
朋友:而6个标志位分别是,URG:这是条紧急信息,ACK:应答消息,PSH:缓冲区还没有填满,RST:重置链接,SYN:创建链接消息标志,FIN:链接关闭通知信息
朋友:窗口大小是接收端用来控制发送端的滑动窗口大小
朋友(松了一口气)
朋友:1)链接方面:TCP面向链接。UDP是无链接的,发送数据以前不须要创建链接
朋友:2)安全方面:TCP提供可靠的服务,保证传送的数据,无差错,不丢失,不重复,且按序到达。UDP则是尽最大努力交付,不保证可靠交付
朋友:3)传输效率:TCP传输效率相对较低,UDP传输效率高
朋友:TCP的链接是基于三次握手,而断开则是四次挥手
朋友:为了保障数据不丢失及错误(可靠性),它有报文校验、ACK应答、超时重传(发送方)、失序数据重传(接收方)、丢弃重复数据、流量控制(滑动窗口)和拥塞控制等机制
朋友(又是常规题,晒晒水啦)
朋友:TCP是可靠的双向通道,因此须要三次握手和四次挥手,我来画个图
三次握手
四次挥手
朋友:提早抢答下,关闭链接时须要四次挥手,比创建时多一次,是由于被动关闭端或许还有数据没被送出去,不能像握手时同样,第二次握手既是发起握手也是响应握手
朋友:若是只有两次握手,client发链接请求后不会再ACK服务端的SYN
朋友:此时若客户端由于自身缘由判断创建链接失败,可能会重复创建TCP链接,而服务端却会认为那些被client丢弃的TCP仍是有效,会白白浪费资源
朋友:CLOSE_WAIT是被动关闭造成的;当对方close socket而发送FIN报文过来时,回应ACK以后进入CLOSE_WAIT状态。随后检查是否存在未传输数据,若是没有则发起第三次挥手,发送FIN报文给对方,进入LAST_ACK状态并等待对方ACK报文到来
朋友:TIME_WAIT是主动关闭链接方式造成的;处于FIN_WAIT_2状态时,收到对方FIN报文后进入TIME_WAIT状态;以后再等待两个MSL(Maximum Segment Lifetime:报文最大生存时间)
朋友(这问得太深了吧,老哥。还好昨天偷偷补课了)
朋友:1)TIME_WAIT的做用是为了保证最后一次挥手的ACK报文能送达给对方,若是ACK丢失,对方会超时重传FIN,主动关闭端会再次响应ACK过去;若是没有TIME_WAIT状态,直接关闭,对方重传的FIN报文则被响应一个RST报文,此RST会被动关闭端被解析成错误
朋友:2)存在两个链接,第一个链接正常关闭,第二相同的链接紧接着创建;若是第一个链接的迷路报文到来,则会干扰第二链接,等待两个MSL则可让上次链接的报文数据消逝在网络后
朋友:第一方式是慢启动和拥塞避免
朋友:1)慢启动,TCP发送端会维护一个拥塞窗口(congestionwindow),简称为cwnd。拥塞窗口初始为1个报文段,每通过一次RTT(数据彻底发送完到确认的时间),窗口大小翻倍(指数增加,只是前期慢)
朋友:2)拥塞避免,它思路是让拥塞窗口cwnd缓慢增大,发送方的cwnd达到阀值ssthresh(初始值由系统决定的)以后,每通过一个RTT就把拥塞窗口加一,而不是加倍(收到两个或四个确认,都是cwnd+1),cwnd呈线性增长(加法增大)
朋友:(画个图好解析)
朋友:若是遇到网络拥塞,拥塞窗口阀值ssthresh减半,cwnd设置为1,从新进入慢启动阶段
朋友:快重传和快恢复
朋友:1)快重传是当接收方收到了一个失序的报文,则立马报告给发送方,赶忙重传
朋友:假如接收方M1收到了,M2没有收到,以后的M三、M四、M5又发送了,此时接收方一共连续给发送方反馈了3个M1确认报文。那么快重传规定,发送方只要连续收到3个重复确认,当即重传对方发来的M2(重复确认报文的后一个报文)
朋友:2)快恢复
朋友:当发送方连续收到三个重复确认,ssthresh减半;因为发送方可能认为网络如今没有拥塞,所以与慢启动不一样,把cwnd值设置为ssthresh减半以后的值,而后执行拥塞避免算法,cwnd线性增大
朋友:(再来一图)
朋友:接收端将本身能够接收的缓冲区大小放入TCP首部中的“窗口大小”字段,经过ACK报文来通知发送端,滑动窗口是接收端用来控制发送端发送数据的大小,从而达到流量控制
朋友:其实发送方的窗口上限,是取值拥塞窗口和滑动窗口二者的最小值
朋友:相同点都是控制丢包现象,实现机制都是让发送方发得慢一点
朋友:不一样点在于控制的对象不一样
朋友:1)流量控制的对象是接收方,怕发送方发的太快,使得接收方来不及处理
朋友:2)拥塞控制的对象是网络,怕发送方发的太快,形成网络拥塞,使得网络来不及处理
朋友:程序须要发送的数据大小和TCP报文段能发送MSS(Maximum Segment Size,最大报文长度)是不同的
朋友:大于MSS时,而须要把程序数据拆分为多个TCP报文段,称之为拆包;小于时,则会考虑合并多个程序数据为一个TCP报文段,则是粘包;其中MSS = TCP报文段长度-TCP首部长度
朋友:在IP协议层或者链路层、物理层,都存在拆包、粘包现象
朋友:1)在数据尾部增长特殊字符进行分割
朋友:2)将数据定为固定大小
朋友:3)将数据分为两部分,一部分是头部,一部分是内容体;其中头部结构大小固定,且有一个字段声明内容体的大小
朋友:SYN Flood 伪造 SYN 报文向服务器发起链接,服务器在收到报文后用 SYN_ACK 应答,此应答发出去后,不会收到 ACK 报文,形成一个半链接
朋友:若攻击者发送大量这样的报文,会在被攻击主机上出现大量的半链接,耗尽其资源,使正常的用户没法访问,直到半链接超时
朋友:1)解析域名 -> 2)发起TCP三次握手,创建链接 -> 3)基于TCP发起HTTP请求 -> 4)服务器响应HTTP请求,并返回数据 -> 5)客户端解析返回数据
朋友:大概有如下几种
200:表示成功正常请求
400:语义有误,通常是请求格式不对
401:需求用户验证权限,通常是证书token没经过认证
403:拒绝提供服务
404:资源不存在
500:服务器错误
503:服务器临时维护,过载;可恢复
朋友: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/1.1提供
朋友:HTTP分块传输编码容许服务器为动态生成的内容维持HTTP持久链接
朋友:分块传输编码容许服务器在最后发送消息头字段。对于那些头字段值在内容被生成以前没法知道的情形很是重要,例如消息的内容要使用散列进行签名
朋友:HTTP服务器有时使用压缩 (gzip或deflate)以缩短传输花费的时间。分块传输编码能够用来分隔压缩对象的多个部分。在这种状况下,块不是分别压缩的,而是整个负载进行压缩。分块编码有利于一边进行压缩一边发送数据
朋友:长链接是指客户端和服务创建TCP链接后,它们之间的链接会持续存在,不会由于一次HTTP请求后关闭,后续的请求也是用这个链接
朋友:长链接能够省去TCP的创建和关闭操做,对于频繁请求的客户端适合使用长链接,可是注意恶意的长链接致使服务受损(建议内部服务之间使用)
朋友:并不是安全,HTTP传输的数据都是明文的,容易被第三方截取;要作安全传输数据,可使用HTTP的升级版HTTPS协议
朋友:1)http协议的链接是无状态的,明文传输
朋友:2)HTTPS则是由SSL/TLS+HTTP协议构建的有加密传输、身份认证的网络协议
朋友:SSL(Secure Socket Layer 安全套接层)是基于HTTPS下的一个协议加密层,保障数据私密性。TLS(Transport Layer Security)则是升级版的SSL
朋友:https在http基础加了一层安全认证及加密层TLS或者SSL,它首先会经过安全层进行ca证书认证,正确获取服务端的公钥
朋友:接着客户端会经过公钥和服务端确认一种加密算法,后面的数据则可使用该加密算法对数据进行加密
原文做者:cscw连接:https://juejin.cn/post/6900439208641921038来源:掘金