常见面试题整理--计算机网络篇 - midiyu - 博客园
为什么连接的时候是三次握手,关闭的时候却是四次握手?
关闭连接时,当服务器端收到FIN报文时,很可能并不会立即关闭连接,所以只能先回复一个ACK报文,告诉客户端端,”你发的FIN报文我收到了”。只有等到我服务器端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
TCP的三次握手过程?
“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。 client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”。主要目的防止server端一直等待,浪费资源。
ARP协议的工作原理(发送请求是广播,响应是单播)
首先,每台主机都会在自己的ARP缓冲区中建立一个 ARP列表,以表示IP地址和MAC地址的对应关系。当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址,如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址;源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
IP地址的分类
A类地址:以0开头,第一个字节范围:1~127;
B类地址:以10开头,第一个字节范围:128~191;
C类地址:以110开头,第一个字节范围:192~223;
D类地址:以1110开头,第一个字节范围为224~239;
TCP报文首部:
SYN:建立连接;
FIN:关闭连接
ACK:响应
PSH: 表示有 DATA数据传输
RST: 表示连接重置。
常见的路由选择协议,以及它们的区别
常见的路由选择协议有:RIP协议、OSPF协议。
RIP协议:底层是贝尔曼福特算法,它选择路由的度量标准(metric)是跳数,最大跳数是15跳,如果大于15跳,它就会丢弃数据包。
OSPF协议:底层是迪杰斯特拉算法,是链路状态路由选择协议,它选择路由的度量标准是带宽,延迟。
TCP的可靠性如何保证?
TCP的可靠性是通过顺序编号和确认(ACK)来实现的。
HTTP协议包括哪些请求?
GET:请求读取由URL所标志的信息。
POST:给服务器添加信息(如注释)。
PUT:在给定的URL下存储一个文档。
DELETE:删除给定的URL所标志的资源。
TCP三次握手和四次挥手的全过程
三次握手:
(简化说:第一次:客户端发送syn包到服务器,等待确认;第二次:服务器收到syn包,确认,并再发送一个syn包+ACK包;第三次:客户端收到服务器的syn+ack包,向服务器发送ack确认包)
第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
四次挥手(简化说,第一次:主动关闭方发送一个FIN,关闭主动方到被动方的数据传送;第二次:被动关闭方收到FIN包,发送一个ACK;第三次:被动关闭方发送一个FIN,关闭被动方到主动方的数据传送;第四次:主动关闭方收到FIN,发送一个ACK确认)
与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
网络体系结构分层:
TCP/IP模型:(4层)应用层、运输层、网络层、网络接口层
5层模型:应用层(报文)、运输层(报文段/用户数据报)、网络层(分组/包)、数据链路层(帧)、物理层(比特)
OSI(7层):应用层、表示层、会话层、运输层、网络层、数据链路层、物理层
应用层:HTTP、FTP、TELNET、SMTP、DNS、SNMP、POP3
运输层:TCP、UDP
网络层:IP、ICMP、ARP、RARP
TCP和UDP区别?各自有什么运输层协议?
TCP:可靠传输、面向字节流、面向连接,
UDP:不可靠、面向数据报、无连接
TCP和UDP最主要的区别是TCP是可靠传输的,UDP是不可靠传输的。所以如果我们的发送消息之类的场景,因为你要确保用户的消息不会丢失,需要使用TCP协议。如果你是在进行视频聊天或者看直播,那你可以使用UDP协议,因为即使几个画面丢失了,对用户来说影响也不是很大。
协议:
TCP:http、pop3(用于读邮件的)、ftp、smtp(简单邮件传输协议)、telnet
UDP: SNMP(简单网络管理协议)、DNS
网络层:
ARP(地址解析协议):IP地址===>物理地址,发送请求用广播,响应用单播
RARP:逆地址解析协议:硬件地址==>IP地址
ICMP:网际控制报文协议
对AS有
IGB(内部网关协议):RIP(基于距离向量的路由选择,基于UDP,大于15就丢失)、OSPF(最短路径优先)
TCP可靠传输工作原理:
1、停止等待协议
2、连续ARQ协议:对按序到达的最后一个分组发送确认
滑动窗口协议:用于网络数据传输时的流量控制,以避免拥塞发生。该协议允许发送方在停止并等待确认前发生多个数据分组(发送方不必每发一个分组就停下来等待确认,可加速数据传输,提高网络吞吐量)
TCP的拥塞控制方法:
慢开始:每经过一次传输轮次,cwnd加倍,设置慢开始门限,到达门限,则==>拥塞避免
(逐步增大发送方的拥塞窗口cwnd,使分组注入到网络的速率更合理)
拥塞避免:每经过一次传输轮次,cwnd+1(使cwnd按线性规律缓慢增大)
快重传:当发生丢失时,发送方会收到接收方的3次重复确认,后立即重传
快恢复:收到3个重复确认后,将慢开始门限减半,再执行拥塞避免+1+1
什么是https协议?https协议用到了哪种密钥?
http无三次握手,它本身是无连接的。
https是在http上面套了一层ssl,用来实现安全连接。用到的密钥有对称密钥和非对称密钥。目前基本上大一点的网站,都会使用https,这里面涉及的知识点也不是很多,但是过程相对来说会复杂一点,感兴趣的话可以去看一下。基本上就是有数字证书,然后把对称密钥作为消息内容,通过非对称密钥来进行传输。之后双方的通信就通过对称密钥来进行解密就行了。
第一次握手的时候的非对称加密用到数字证书吧 之后的对称加密就是通过服务器的公钥和私钥
什么是socket?
socket是用来进行网络通信的,java里面已经有封装好这个类了,分为客户端和服务器,通过ip+端口来进行访问。如果没有用过socket的话,建议你到网上找一个demo,跟着写一下,你基本上就知道socket怎么用了,算是比较简单的。
什么是IO,什么是NIO,什么是AIO,什么是netty框架?
如果我上面那个问题,你自己有到网上找一个例子去写一下,你就会发现在socket在读取消息的时候阻塞的。这里有一个概念,阻塞。如果你不知道什么是阻塞函数的话,需要去了解一下。
NIO就是非阻塞IO,用来解决上面读取消息的时候会阻塞的问题。在jdk1.4左右引入的,是通过selector、buffer、通道等组件来实现的,具体实现原理我觉得还是需要有所了解的。
AIO就是异步非阻塞IO。咱们上面说的NIO是同步阻塞IO。AIO是异步的,NIO是同步的。同步和异步是什么区别我有点讲不清楚,如果这个你不懂自己去查一下资料。异步基本上就是通过回调来实现的。AIO是在jdk1.7左右引入的,面试官问AIO一般也会问得比较少。
netty是用来实现非阻塞IO的一个框架,这个作为拓展点,感兴趣可以去了解一下。我在面试阿里的时候被问到过,其他公司还没问过。
当你输入域名访问一个网站的时候,背后的过程是什么?
【1、得到IP地址:浏览器先尝试从浏览器缓存中获取http://www.baidu.com/对应的IP地址,如果不能获取,就使用DNS协议来获取IP。
2、通过IP地址寻址,找到目标(服务器)地址
3、使用TCP协议,建立TCP连接(3次握手)
在TCP协议中,建立TCP需要与百度服务器握手三次,你先告诉服务器你要给服务器发东西(SYN),服务器应答你并告诉你它也要给你发东西(SYN、ACK),然后你应答服务器(SYN、ACK),总共来回了3次,称为3次握手。
不过,建立TCP连接有个前提(或者说给服务器发消息有个前提):你必须能成功地把消息发到服务器上,需要用到IP协议、ARP协议和OSPF协议。
4、浏览器用HTTP协议请求网页内容
5、服务器处理请求,对请求做出HTTP响应
6、浏览器收到服务器的响应,得到HTML代码
7、渲染页面
】
应用层:HTTP FTP SMTP TELNET
运输层:UDP TCP
网络层:IP ICMP ARP RARP
数据链路层:IP数据报
物理层
UDP:DNS、SNMP
TCP:FTP HTTP SMTP TELNET
DNS解析流程?
【DNS:端口号53,UDP协议。
1、本地客户机提出域名解析请求,查找本地HOST文件后将该请求发送给本地域名服务器;
2、当本地的域名服务器收到请求后,先查询本地的缓存,若有记录项,则本地的域名服务器直接返回查询结果;
3、若本地DNS缓存中无该记录,则本地域名服务器直接把请求发给根域名服务器,根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址;
4、本地服务器再向上一步返回的域名服务器发送请求,接受请求的服务器查询自己的缓存,若没有记录,则返回相关的下级的域名服务器的地址;
5、重复第四部,直到找到正确记录;
6、本地域名服务器把返回结果保存到缓存,以备下次使用,同时将结果返回客户机】
向下的过程中,添加下层协议所需要的首部或尾部;向上的过程中,不断拆开首部和尾部。
TCP协议:SMTP FTP POP3 Telnet HTTP
UDP协议:SNMP DNS
2类密码体制:
1、对称密钥密码体制:加密密钥和解密密钥是相同密码体制(DES)
密钥保密,算法公开
2、公钥密码体制:不同的加密密钥与解密密钥(一是因为对称密钥密码体制的密码分配问题,而是由于对数字签名的需求)(RSA、数字签名)
加密密钥PK(即公钥)对公众公开,而解密密钥SK(私钥或密钥)需要保密,但加密算法E、解密算法D公开
过程:
发送者A ==>对明文X用B的公钥PKB 和 E加密算法 ==> 加密为 密文Y ==>通过互联网 ==> 对密文Y用B的私钥SKB 和D解密算法 ==> 明文X==>接收者B
数字签名:
A==》 对明文X用A的私钥SKA 和D算法签名 ==》 密文DSKA(X) ==> 通过互联网 ==》对密文DSKA(X) 用A的公钥PKA 核实签名和E运算 ==》明文X ==》B
Cookie:
在http服务器和客户之间传递的状态信息。
Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息。
一些 Cookie 是临时的,有些则是持续的。临时的 Cookie 只在浏览器上保存一段规定的时间,一旦超过规定的时间,该 Cookie 就会被系统清除。持续的 Cookie 则保存在用户的 Cookie 文件中,下一次用户返回时,仍然可以对它进行调用。
Socket:套接字
用于建立网络连接,如用于TCP UDP编程
套接字又分为流套接字【socket、serversocket(TCP)】和数据报套接字【DatagramSocket、MulticastSocket】