JAVA面试系列-计算机网络部分
所有题目均来自于JAVA面试系列
1.TCP三次握手和四次挥手的过程,每次发送的包的内容,客户端和服务端的状态?
三次握手:指的是客户端和服务器之间建立连接的过程
第一次握手:客户端发送连接请求报文段,此时报文段中控制位SYN=1,ACK=0,发送顺序号seq=x(随机数),客户端进入SYN发送状态(SYN-SEND),等待服务器确认。
第二次握手:服务端收到了发送过来的包,服务端为该tcp连接分配缓存和变量,并向客户端返回确认报文段,标志位SYN=1,ACK=1,发送顺序号seq=y(随机数),接收顺序号ack=x+1,服务器处于SYN接收状态(SYN-RCVD)。
第三次握手:客户端收到服务器传来的包后,客户端为该tcp连接分配缓存和变量,并向服务端返回一个确认的确认报文段,标志位SYN=0,ACK=1,发送顺序号seq=x+1(随机数),接收顺序号ack=y+1
客户端和服务器进入ESTABLISHED建立成功状态,完成三次握手。
四次挥手:指的是客户端和服务器之间断开连接的过程
第一次挥手:客户端发送连接释放报文段,FIN标志位为1,发送顺序号seq为x,客户端进入FIN-WAIT-1状态。
第二次挥手:服务器接收到该报文后,发送一个确认报文:令ACK=1,确认序号ack = u+1,自己的报文序号seq=v,发送后,服务器进入CLOSE-WAIT状态,此时TCP连接进入连接半关闭状态。
第三次挥手:客户端收到来自服务器的确认之后,进入FIN-WAIT-2状态。等待服务器发送连接释放报文,如果服务器已经没有要发送的数据,则释放TCP连接,向客户端发送报文:令FIN=1,ACK=1,确认号ack =u+1,自己的序号seq = w(w可能等于v也可能大于v),服务器进入LAST-ACK状态。
第四次挥手:客户端收到服务器的连接释放报文后,对该报文发出确认,令ACK=1,确认号ack=w+1,自己的序号seq=u+1,发送此报文后,等待2个msl(最长报文段寿命)时间后,进入CLOSED状态,服务器收到客户端的确认后,也进入CLOSED状态并撤销传输控制块。
通俗理解:
三次握手:A对B说:我的序号是x,我要向你请求连接;(第一次握手,发送SYN包,然后进入SYN-SEND状态)
B听到之后对A说:我收到了你序号为x的话(ack=x+1),同意建立连接,我的序号是y(第二次握手,发送ACK-SYN包,然后进入SYN-RCVD状态)
A听到B说同意建立连接之后,对A说:已确认你同意与我连接(ack=y+1,ACK=1,seq=x+1)。(第三次握手,A已进入ESTABLISHED状态)
B听到A的确认之后,也进入ESTABLISHED状态。
四次挥手:
1.A与B交谈结束之后,A要结束此次会话,对B说:我要关闭连接了(seq=u,FIN=1)。(第一次挥手,A进入FIN-WAIT-1)
2.B收到A的消息后说:确认,你要关闭连接了。(seq=v,ack=u+1,ACK=1)(第二次挥手,B进入CLOSE-WAIT)
3.A收到B的确认后,等了一段时间,因为B可能还有话要对他说。(此时A进入FIN-WAIT-2)
4.B说完了他要说的话(只是可能还有话说)之后,对A说,我要关闭连接了。(seq=w, ack=u+1,FIN=1,ACK=1)(第三次挥手)
5.A收到B要结束连接的消息后说:已收到你要关闭连接的消息。(seq=u+1,ack=w+1,ACK=1)(第四次挥手,然后A进入CLOSED)
6.B收到A的确认后,也进入CLOSED。
2.为什么是三次握手,可以四次握手或者两次握手吗?
记住服务器的资源宝贵不能浪费! 如果在断开连接后,第一次握手请求连接的包才到会使服务器打开连接,占用资源而且容易被恶意攻击!防止攻击的方法,缩短服务器等待时间。两次握手容易死锁。如果服务器的应答分组在传输中丢失,将不知道S建立什么样的***,C认为连接还未建立成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
3.为什么握手是三次,而挥手要四次?
建立连接时,ACK和SYN可以放在一个报文里来发送。而关闭连接时,被动关闭方可能还需要发送一些数据后,再发送FIN报文表示同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
4.TCP四次挥手为什么需要TIME-WAIT阶段等待2MSL,是哪一方有TIME-WAIT阶段?(主动释放释放连接的那端)
两个存在的理由:1、无法保证最后发送的ACK报文会一定被对方收到,所以需要重发可能丢失的ACK报文。2、关闭链接一段时间后可能会在相同的IP地址和端口建立新的连接,为了防止旧连接的重复分组在新连接已经终止后再现。2MSL足以让分组最多存活msl秒被丢弃。
5.TCP的长连接和短连接
长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于P2P通信。例如数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,频繁的socket创建也是对资源的浪费
短连接:Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯。web网站的http服务一般都用短连接。因为长连接对于服务器来说要耗费一定的资源。像web网站这么频繁的成千上万甚至上亿客户端的连接用短连接更省一些资源
6.什么是syn flood攻击,如何应对syn flood攻击
Client发送SYN包给Server后挂了,Server回给Client的SYN-ACK一直没收到Client的ACK确认,这个时候这个连接既没建立起来,也不能算失败,称为半连接。这就需要一个超时时间让Server将这个连接断开,否则这个连接就会一直占用Server的SYN连接队列中的一个位置,大量这样的连接就会Server的SYN连接队列耗尽,让正常的连接无法得到处理。
目前,Linux下默认会进行5次重发SYN-ACK包,重试的间隔时间从1s开始,下次的重试间隔时间是前一次的双倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 63s,TCP才会把断开这个连接。由于,SYN超时需要63秒,那么就给攻击者一个攻击服务器的机会,攻击者在短时间内发送大量的SYN包给Server(俗称 SYN flood 攻击),用于耗尽Server的SYN队列
解决方案:SYN cookie(半连接和长连接)
7.在浏览器中输入一个网址回车后发生了什么
DNS解析->tcp连接->发送http请求->服务器处理请求并返回http报文->浏览器解析渲染->关闭连接
8.http和https的区别
协议不同:http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
端口不同:前者是80,后者是443
9.IP地址和MAC地址有什么区别
MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址,应用于局域网;IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,应用于广域网。
10.网站为什么要使用cookie和session;cookie和session有什么区别
由于HTTP是一种无状态协议,服务器没有办法单单从网络连接上面知道访问者的身份,为了解决这个问题,就诞生了Cookie.
当客户端第一次通过某个网址访问服务器时,如果服务器需要记录用户的状态,就使用response向客户端浏览器颁发一个Cookie,客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
Cookie实际上就是通信证,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。
Session机制是一种服务端的机制,服务器使用一种类似散列表的结构来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端里的请求里是否已包含了一个session标识–sessionID,如果已经包含一个sessionID,则说明以前已经为此客户端创建过session,服务器就按照sessionID把这个session检索出来使用。如果客户端请求不包含sessionID,则为此客户端创建一个session并且声称一个与此session相关联的sessionID,sessionID的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串(服务器会自动创建),这个sessionID将被在本次响应中返回给客户端保存,用户信息存储再服务器端。
主要区别:
1.具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到, 由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。
2.cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie,单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。最后可以将登陆信息等重要信息存放为session。