计算机网络相关面试重点整理
本文学习自GitHub上的JavaGuide项目,感谢大佬的资源,此处为自我学习与整理,原项目链接 JavaGuide
OSI和TCP/IP各层的结构和功能,都有哪些协议?
我们平时学习计算机网络使用五层结构,比较清楚且简洁。下图是OSI和TCP/IP和五层结构的对比
图源JavaGuide
- 应用层:通过进程间的交互完成特定的网络应用,不同的网络应用需要不同的应用层协议,各种应用层协议:DNS,HTTP,SMTP等。应用层互相交互的数据单元叫报文。
DNS(域名系统):将域名和IP地址相互映射的一个分布式数据库,可以让人不用记住IP的数据串,通过域名来访问Internet
HTTP(HyperText Transport Protocol):超文本传输协议。是互联网上流传最广的一种协议,所有万维网(WWW)文件都必须遵从HTTP协议标准,最初HTTP的目的是为了提供一种传输和接收HTML的方法 - 运输层:运输层的主要任务就是负责两台主机进程之间的通信提供数据传输服务。应用层利用运输层传输数据报文。
运输层主要使用TCP和UDP两种协议。
TCP:面向连接,可靠的数据传输服务
UDP:无连接,尽最大努力传输数据的服务,不保证传输的可靠性 - 网络层:在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换节点,确保数据的及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据封装成分组和包进行传送。
在TCP/IP中因为网络层使用IP协议,因此分组也叫IP数据报,简称数据报。 - 链路层:两台主机之间的数据传输,总是在一段一段的链路上传输的,这就要使用专门的链路层协议。在两个相邻节点的链路上传送数据时,链路层将网络层下来的IP数据报组装成帧,在两个节点之间传送帧。每一帧包括数据和必要的信息。
在接收时,帧包括的控制信息能够告诉接收端哪个比特开始,哪个比特结束。 - 物理层:物理层上的传输单位是比特,物理层的作用是实现相邻计算机节点之间的比特流透明传输,尽可能屏蔽掉具体传输介质和物理设别的差异。
TCP三次握手
- 过程:
(1)客户端发送SYN
(2)服务端返回SYN/ACK
(3)客户端返回ACK - 三次握手的作用:第一次握手,服务端知道客户端发送功能正常;第二次握手,客户端知道服务端发送功能和自己接收功能正常,第三次握手,服务端知道自己发送功能正常。
断开TCP的四次挥手
- 过程:
(1)客户端发送FIN
(2)接收端回复ACK
(3)接收端回复FIN
(4)客户端回复ACK - 四次挥手的作用:双方都知道对方已经完成所有要完成的任务,且自己已经完成任务,互相确认以后断开连接。(就像两个人挂电话一样)
TCP如何保证可靠传输?
- 应用数据被划分为TCP认为最合适的数据块
- TCP对发送的每个包进行编号,接收方对其进行排序,把有序的数据包传送给应用层
- 校验和:TCP将保持它首部和数据的检验和,如果接收端收到段的检验和有差错,这个报文段将被丢弃并且不被确认接受
- TCP接收端会丢弃重复的数据
- 流量控制:TCP每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区可以接受的数据,当接收端来不及处理数据,可以提示发送端降低发送速度防止丢包。具体算法是滑动窗口。
- 拥塞控制:当网络拥塞减少数据传送
- ARQ协议:重传的协议,有停止等待和连续ARQ两种
- 超时重传:当发送端发送一个数据,如果在规定时间内没有收到接收端的确认,将会重传这个报文段
在浏览器输入一个链接后发生了什么?
- DNS解析:通过域名找到对应的ip地址
- TCP链接:建立一个TCP用来发送报文和数据
- 发送HTTP请求
- 服务器端处理HTTP请求并返回HTTP报文
- 浏览器解析并渲染HTTP页面
- 断开连接
HTTP状态码
- 1打头表示信息性状态码。接受的请求正在处理
- 2打头表示成功,请求正常处理完毕
- 3打头表示重定向,需要进行附加操作才能完成请求
- 4打头表示客户端错误,服务器无法处理请求
- 5打头表示服务器端错误,服务器处理请求错误
HTTP长连接和短连接
- 在HTTP1.0中默认短连接,即每进行一次HTTP操作都会建立、断开一个TCP。
- 从HTTP1.1开始默认使用长连接,会有如下报文:
Connection:keep-alive
长连接中客户端和服务器端的TCP不会马上断开,客户端再次访问时将会使用同一个TCP,keep-alive有一个设定的保持时间保持TCP不断开。
HTTP中的Session和Cookie
因为HTTP是无法保存状态的协议,当服务器需要保存用户的一些数据(比如购物车)时就会给用户设一个特定的Session来标识用户,因为Session在服务器端,所以追踪用户需要用户的SessionID,SessionID通常存储在Cookie里(在客户端),为了防止Cookie被禁用,可以通过直接把SessionID加到URL里来追踪用户。
HTTP和HTTPS的区别?
- 端口不同:HTTP的URL由http://起始并且默认端口是80;HTTPS由https://起头并且默认端口是443
- 安全性和资源消耗:HTTP运行在TCP上,所有的传输内容明文显示,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL/TLS上的HTTP协议,SSL/TLS运行在TCP上,所有传输内容都采用了对称加密,但是密钥被服务器方进行了非对称加密。所以安全性HTTPS更好,但是HTTPS消耗更多的服务器资源。