[java后端]线下笔试及面试复习资料[一]

   本资料主要针对线下笔试及面试,线上面试靠这些肯定不够。
  先放上第一部分,大家觉得好的话继续放。线下笔试部分主要是剑指offer的部分题的答案整理,一共40道题。然后面试面试的话,接近110页。题目都是根据牛客网上的笔试面试经验以及我自己的笔经面经来的。

计算机网络

三次握手和四次挥手

 

1) 请求端发送一个syn段指明客户打算连接的服务器的端口,以及初始序号。

2) 服务器发回包含服务器的初始序号的syn报文段,同时将确认序号设置为客户的序号加1.

3) 客户必须将确认序号设置为服务器的序号加1以对服务器的syn报文段进行确认

TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这就是所谓的半关闭。只有很少的应用程序使用它。

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说" 我Client端没有数据要发给你了 ",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK," 告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息 "。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文," 告诉Client端,好了,我这边数据发完了,准备好关闭连接了 "。Client端收到FIN报文后," 就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传 。“,Server端收到ACK后," 就知道可以断开连接了 "。Client端等待了2MSL后依然没有收到回复,则证明 Server端已正常关闭,那好,我Client端也可以关闭连接了 。Ok,TCP连接就这样关闭了!

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

 

C lient端主动打开连接、主动关闭连接的情况:

C lient主动打开,SYN_SENT状态,发送SYN J,服务器收到进入SYN_RCVD状态,SYN K,ack J+1,客户端进入established状态,发送ack K+1,服务器端进入ESTABLISHED状态。

客户端FIN_WAIT1状态,发送FIN M,服务器端进入CLOSE_WAIT状态,发送ack M+1,客户端FIN_WAIT2状态,当服务器端发送完LAST_ACK后,服务器端发送FIN N,客户端进入TIME_WAIT状态(在这个状态停留2MSL的时间,MSL:报文段最长生存时间),发送ackN+1.服务器端closed状态。

 

TCP协议

1. TCP提供一种面向连接的、可靠的字节流服务。

2. 提供可靠性的方法:

TCP按报文段发送;

有用于超时重传的定时器;

确认是否收到确认;

保持它首部和数据的检验和

可能需要重新排序;

能够丢弃重复数据;

流量控制;

3. TCP首部:16位源端口号,16位目的端口号,32位序号,32位确认序号,4位首部长度,16位窗口大小、检验和(发端计算和存储,并由收端进行验证)、紧急指针等

4. TCP的数据流分为两种交互数据流和成块数据流。按字节计算,成块数据与交互数据的比例约为90%和10%;按分组数量计算,各占一半。

5. 交互数据流的拥塞控制:Nagle算法:该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP收集这些少量的分组,并在确认到达之前时以一个分组的方式发出去。

6. TCP的滑动窗口协议:

窗口合拢:窗口左边沿向右边沿靠近,发生在数据被发送和确认时;

窗口张开:窗口右边沿向右移动时将允许发送更多的数据,发生在另一端的接受进程读取已经确认的数据并释放了TCP的接受缓存时;

7. 拥塞控制:慢启动、拥塞避免、快速恢复、快速重传。

拥塞窗口:发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。

慢启动:该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加为2,即可以发送两个报文段。

8. TCP管理4个不同的定时器:

重传定时器使用于当希望收到另一端的确认;

坚持定时器使窗口大小信息保持不断流动;

保活定时器可检测到一个空闲连接的另一端合何时崩溃或重启;

2MSL定时器测量一个链接处于TIME_WAIT状态的时间;

9. 拥塞避免算法是一种处理丢失分组地方法;(拥塞避免和慢启动算法维持两个变量:一个拥塞窗口CWND和一个慢启动门限ssthresh

10. 快速重传与快速恢复算法:如果一连串收到3个或3个以上的重复ACK,就非常可能是一个报文段丢失了。于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。这就是快速重传算法。接下来执行的是不是慢启动算法而是拥塞避免算法。这就是快速恢复算法。

 

 

TCP粘包

一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据。

1: 如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题 (因为只有一种包结构,类似于http协议)。关闭连接主要要双方都发送close连接(参考tcp关闭协议)。如:A需要发送一段字符串给B,那么A与B建立连接,然后发送双方都默认好的协议字符如"hello give me sth abour yourself",然后B收到报文后,就将缓冲区数据接收,然后关闭连接,这样粘包问题不用考虑到,因为大家都知道是发送一段字符。
2: 如果发送数据无结构,如文件传输,这样发送方只管发送,接收方只管接收存储就ok,也不用考虑粘包
3:如果双方建立连接,需要在连接后一段时间内发送不同结构数据,如连接后,有好几种结构:
 1)"hello give me sth abour yourself" 
 2)"Don't give me sth abour yourself" 
  那这样的话,如果发送方连续发送这个两个包出去,接收方一次接收可能会是"hello give me sth abour yourselfDon't give me sth abour yourself"这样接收方就傻了,到底是要干嘛?不知道,因为协议没有规定这么诡异的字符串,所以要处理把它分包,怎么分也需要双方组织一个比较好的包结构,所以一般可能会在头加一个数据长度之类的包,以确保接收。

三.粘包出现原因:在流传输中出现,UDP不会出现粘包,因为它有消息边界(参考Windows网络编程)
1发送端需要等缓冲区满才发送出去,造成粘包
2接收方不及时接收缓冲区的包,造成多个包接收

 

HTTP协议和HTTPS协议

http:端口号80

https:端口号443

HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议:  
  它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息,它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。总的来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议要比http协议安全。

   在URL前加https://前缀表明是用SSL加密的,你的电脑与服务器之间收发的信息传输将更加安全。  Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定。 


HTTPS和HTTP的区别:  
  https协议需要到ca申请证书,一般免费证书很少,需要交费。 
  http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。 
  http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。 
  http的连接很简单,是无状态的。 
  HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。 

 

  http状态码3xx 4xx 5xx分别是啥
       重定向,客户端错误,服务器端错误

1xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码。

代码说明 
100(继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 
101(切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。 

2xx(成功)
表示成功处理了请求的状态代码。
代码说明 
200(成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 
201(已创建) 请求成功并且服务器创建了新的资源。 
202(已接受) 服务器已接受请求,但尚未处理。 
203(非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。 
204(无内容) 服务器成功处理了请求,但没有返回任何内容。 
205(重置内容) 服务器成功处理了请求,但没有返回任何内容。
206(部分内容) 服务器成功处理了部分GET请求。 

3xx(重定向) 
表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向。

代码说明 
300(多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者(user agent)选择一项操作,或提供操作列表供请求者选择。 
301(永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对GET或HEAD请求的响应)时,会自动将请求者转到新位置。
302(临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303(查看其他位置) 请求者应当对不同的位置使用单独的GET请求来检索响应时,服务器返回此代码。
304(未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 
305(使用***) 请求者只能使用***访问请求的网页。 如果服务器返回此响应,还表示请求者应使用***。 
307(临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 

4xx(请求错误) 
这些状态代码表示请求可能出错,妨碍了服务器的处理。

代码说明 
400(错误请求) 服务器不理解请求的语法。 
401(未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。 
403(禁止) 服务器拒绝请求。
404(未找到) 服务器找不到请求的网页。
405(方法禁用) 禁用请求中指定的方法。 
406(不接受) 无法使用请求的内容特性响应请求的网页。 
407(需要***授权) 此状态代码与401(未授权)类似,但指定请求者应当授权使用***。
408(请求超时) 服务器等候请求时发生超时。 
409(冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。 
410(已删除) 如果请求的资源已永久删除,服务器就会返回此响应。 
411(需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。 
412(未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。 
413(请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 
414(请求的URI过长) 请求的URI(通常为网址)过长,服务器无法处理。 
415(不支持的媒体类型) 请求的格式不受请求页面的支持。 
416(请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。 
417(未满足期望值) 服务器未满足"期望"请求标头字段的要求。 

5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。

代码说明 
500(服务器内部错误) 服务器遇到错误,无法完成请求。 
501(尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 
502(错误网关) 服务器作为网关或***,从上游服务器收到无效响应。 
503(服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 
504(网关超时) 服务器作为网关或***,但是没有及时从上游服务器收到请求。 
505(HTTP版本不受支持) 服务器不支持请求中所用的HTTP协议版本。

 

HTTP请求头和返回头

HTTP请求头

ACCEPT,ACCEPT-ENCODING,ACCEPT-LANGUAGE,CONNECTION,COOKIE,HOST,USER-AGENT,REFERER,

HTTP返回头

CONNECTION,CONTENT-ENCODING,CONTENT-TYPE,DATE,SET-COOKIE,TRANSFER-ENCODING,VARY

 

S ocket模型

1. socket函数

为了执行网络I/O,一个进程必须做的第一件事情就是调用socket函数,指定期望的通信协议类型。

2. connect函数

用socket函数来建立与TCP服务器的连接。

3. bind函数把一个本地协议地址赋予一个套接字。对于国际网协议,协议地址是32位的IPV4地址或128位的IPV6地址与16位的TCP或UDP端口的组合。

4. L isten函数:当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用connect发起连接的客户套接字。 L isten函数把一个未连接的套接字转换成一个被动套接字,指示内核应接受指向该套接字的连接请求。根据TCP状态转换图,调用listen导致套接字从closed转换到listen状态。

5. A ccept函数:accept函数由TCP服务器调用,用于从已完成连接队列队头返回下一个已完成连接(图4-7)。如果已完成连接队列为空,那么进程被投入睡眠。

6. C lose函数:关闭套接字,终止TCP连接。

 

SYN攻击

 

SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。从上图可看到,服务器接收到连接请求(syn=j),将此信息加入未连接队列,并发送请求包给客户(syn=k,ack=j+1),此时进入SYN_RECV状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

#Java工程师#
全部评论
点赞 回复
分享
发布于 2016-11-06 23:28
非常不错
点赞 回复
分享
发布于 2016-11-07 12:40
小红书
校招火热招聘中
官网直投
四次挥手time_wait解释有问题。ack不占用序列号,是为了等待S端可能重发的FIN,对其进行回复,虽然结果都是发送ACK,逻辑还是不同的。
点赞 回复
分享
发布于 2018-09-18 23:42
赞!
点赞 回复
分享
发布于 2016-11-06 23:45
求分享
点赞 回复
分享
发布于 2016-11-07 01:01
太赞,继续分享吧~~~~
点赞 回复
分享
发布于 2016-11-07 09:56
楼主可以陆续发其他一些吗?
点赞 回复
分享
发布于 2016-11-07 12:40
点赞 回复
分享
发布于 2016-11-07 18:43
能留邮箱吗
点赞 回复
分享
发布于 2016-11-07 18:43
楼主,继续分享吧,期待
点赞 回复
分享
发布于 2016-12-03 18:42
好东西!希望楼主继续更新😁
点赞 回复
分享
发布于 2017-01-14 09:57
楼主,写的非常棒,希望楼主继续更新!
点赞 回复
分享
发布于 2017-03-26 14:21
求分享啊
点赞 回复
分享
发布于 2017-03-26 18:03

相关推荐

45 449 评论
分享
牛客网
牛客企业服务