计算机网络面试核心知识点
一、网络分层
- 第一层, 物理层
- 第二层, 数据链路层
- 1.格式化数据
- 2.提供对物理层的访问接口
- 第三层, 网络层
- 控制子网的运行,如:逻辑编址、分组传输、路由选择。
- 第四层, 传输层
- 1.TCP(错误回传、滑动窗口)
- 2.UDP协议(TCP打包、IP找路由)
- 3.将数据进行分割、编号,交给网络层
- 第五层 会话层
- 1.用户级别层面
- 2.自动收发包、自动寻址
- 3.不同机器上的用户之间建立及管理会话
- 第六层 表示层
- 1.信息的语法语义以及它们的关联,如:加密、解密、转换翻译、压缩、解压缩等
- 第七层 应用层
- 1.关注HTTP协议、FTP、DNS
二、TCP的三次握手
(IP地址)唯一标示主机+(TCP协议+端口号)唯一标示主机中的进程,可以唯一表示网络中的一个进程。网络进程就可以通过Socket进行网络通信。
“握手”是为了建立全双工连接,TCP(提供可靠的连接服务)三次握手:
-
1.客户端与服务器端默认为close状态,直到有一方发起主动连接请求。
-
2.服务器先创建传输控制块PCD,时刻准备接收连接请求,状态变为listen。
-
3.客户端创建PCD,向服务器发起请求连接报文(SYN=1、seq=x),客户端进入SYN-SENT状态。第一次握手,不可携带数据。
-
4.服务器收到请求报文,如果同意连接会发出确认报文(SYN=1,ACK=1,seq=y,ack=x+1)。服务器进入SYN-RCVD同步收到状态。第二次握手。不可携带数据。
-
5.客户端收到响应报文后,再次向服务器发出确认报文(ACK=1,seq=x+1,ack=y+1),客户端进入EASTB-LISHED状态。第三次握手,可以携带数据。
-
6.服务器收到确认请求报文,进入EASTB-LISHED状态,完成三次握手。
为什么要三次握手才能建立连接?
为了通知对方彼此的Sequence Number初始值,SYN会作为数据通信序号,保证应用层接受的数据不会乱序,TCP以该序号进行排序。
首次握手的隐患?
SYN超时问题,Server收到Client的SYN,回复SYN-ACK的时候(Client停止访问)Server未收到ACK确认,Server会不断重试直至超时(63s)才断开连接,根据此特性可以对Server发起占用资源的攻击。
可以用SYN Cookies解决。
建立连接,Client出现故障?
保活机制,向对方发送探测报文,尝试次数达到保活探测数,还未收到响应则中断连接。
TCP Flags:
- 1.ACK:确认序号标志
- 2.URG:
- 3.PSH
- 4.RST
- 5.SYN:同步序号,用于建立连接过程
- 6.FIN:finish标志,用于释放连接
三、TCP的四次挥手
“挥手”,终止连接。
-
1.Server与Client都处于ESTAB-LISHEN状态,Client连接发起连接释放报文(也可以停止发送数据)(FIN=1,seq=u),Client进入FIN-WAIT-1终止等待状态。第一次挥手。
-
2.Server收到FIN报文后,发起确认报文(ACK=1,seq=v,ack=u+1),Server进入CLOSE-WAIT关闭等待状态。第二次挥手。Client收到确认报文后,进入FIN-WAIT-2终止等待状态。第二次挥手和第三次挥手之间还可以进行数据传送。
-
3.Server发送连接释放报文(FIN=1,ACK=1,seq=w,ack=u+1),用来关闭双方数据传送,Server进入LAST-ACK最终确认状态。第三次挥手。
-
4.Client发送确认释放报文(ACK=1,seq=u+1,ack=w+1),进入TIME-WAIT时间等待状态。TCP还未释放,必须经过2MSL时间后才真正释放,进入CLOSED状态。第四次挥手。
-
5.Server收到确认,进入CLOSED状态。
为何有TIME-WAIT状态?
- 1.确保有足够的时间让对方收到ACK包。
- 2.避免新旧连接混淆。
为何需要四次挥手?
因为全双工,双方都需要FIN报文和ACK报文。
Server出现大量CLOSE_WSIT状态原因?
- 1.检查代码,特别是释放资源的代码。
- 2.检查配置,特别是处理请求的线程配置。
四、UDP与TCP简介
4.1 UDP特点
- 1.面向非连接。
- 2.不维护连接状态,支持同时向多个客户端传输相同的消息。
- 3.数据包报头只有8个字节,额外开销较小。
- 4.吞吐量只限于数据生成速率、传输速率。
- 5.不保证可靠交付。
- 6.面向报文,不对提交的报文进行拆分或合并。
4.2 TCP(面向字节流)
- 1.面向连接
- 2.可靠性
- 3.有序性
- 4.速度
- 5.量级
4.3 TCP的滑窗
滑动窗口可以依据某些策略动态调整,可以使用TCP对滑动窗口的操纵:
- 1.流量控制
- 2.乱序重排
TCP的传输可靠性?
- 1.接收窗口的滑动机制。(发送窗口只有收到本段发送字节的ACK确认,才会移动发送窗口的左边界,接受窗口只有在前面接收段都确认的情况下,才会移动左边界)。
- 2.确认重传机制。
五、HTTP简介
HTTP协议基于请求与响应模式的、无状态的应用层协议。
主要特点:
- 1.支持客户\服务器模式。
- 2.简单快速:只需请求方法与路径,客户端就可向服务器请求数据。
- 3.灵活:传输任意类型数据。
- 4.无连接:每次连接只处理一个请求,就关闭。(keep-alive可能会有长连接)
- 5.无状态
5.1 请求/响应的步骤:
- 1.客户端连接到Web服务器(通过TCP的三次握手)。
- 2.通过TCP套接字,客户端发起文本请求报文。
- 3.服务器接受请求并返回HTTP响应。(服务器解析该请求、定位请求资源、将资源副本写到TCP套接字,由客户端读取)。
- 4.释放TCP连接
- 5.客户端接收返回的数据并进行HTML解析,首先解析状态码、……、格式化html内容。
5.2 发送URL后经历的流程?
- 1.DNS解析:浏览器会根据URL逐层(浏览器缓存、系统缓存、路由器缓存、IPS服务器缓存、根域名服务器缓存、域名服务器缓存)查询DNS缓存,解析URL中的域名对应的IP地址。
- 2.根据URL和对应的端口,建立TCP连接。
- 3.发送HTTP请求。
- 4.服务器处理请求并返回HTTP报文。
- 5.浏览器解析并渲染页面。
- 6.连接结束。
GET请求和POST请求的区别?
- 1.Http报文层面:GET将请求信息放在URL以❓隔开;POST放在报文体中,需要解析才能获取请求信息,安全性较高一点。
- 2.数据库层面:GET符合幂等性(对数据库的一次操作和多次操作获得的结果是一致的)和安全性(对数据库的操作没有改变数据库中的数据),POST都不符合。
- 3.其他层面:GET可以被缓存、被存储,而POST不行。
绝大部分的GET请求会被CDN缓存,减少web服务器的负担。
6.Cookie和Session的区别
6.1 Cookie简介
- 1.是由服务器发送给客户端的特殊信息,以文本的形式存放在客户端。客户端发起请求时,服务端进行响应,在返回超文本的同时,会在HTTP的响应头带上cookie,并把cookie存放在客户端的特定位置。
- 2.客户端再次请求时,会把cookie回发。
- 3.服务器接收后,会解析cookie生成与客户端相对应的内容。
6.2 session简介
- 1.服务器端的机制,在服务器上保存的信息。
- 2.当服务器为要某个客户端请求创建session id时,首先检查请求是否已包含session标示即session id。如果已包含session id,服务器就根据session id将session值检索出来使用,如果客户端请求不包含session id,则会为此客户端创建一个session和与该session相关的session id,并回发给客户端进行保存。
6.3 session的实现方式
- 1.使用Cookie来实现,服务器为每个session分配一个Jsessionid,并通过cookie发送给客户端。客户端发起请求时,会在cookie头中携带Jsessionid,通过Jsessionid在服务器中找到相对应的session。
- 2.使用URL回写来实现,服务器在发送给客户端的所有响应中,会携带Jsessionid参数,在请求时,带回服务器。
session 和cookies的区别?
- 1.Cookie数据存放在客户端,Session数据存放在服务器。
- 2.Session相对于Cookie更安全。
- 3.若考虑减轻服务器负担,应当使用Cookie。
七、HTTP和HTTPS的介绍
HTTPS之与HTTP上加入了SSL 和 TLS,有保护交换数据隐私、完整性和网站服务器身份认证的功能。
SSL(Securoty Sockets Layer 安全套接层):
- 1.为网络通信提供安全及数据完整性的一种安全协议。
- 2.位于TCP和应用层之间,是操作系统对外的API。
- 采用身份验证和数据加密保证网络通信的安全和数据的完整性。
7.1 HTTPS数据传输流程
- 1.浏览器将支持的加密算法信息发送给服务器。
- 2.服务器选择一套浏览器支持的加密算法,以证书(证书发布的CA机构、证书有效期、公钥、签名等)的形式回发浏览器。
- 3.浏览器验证证书合法性,浏览器随机生成一串密码并结合证书中的公钥加密信息发送给服务器。
- 服务器使用私钥解密信息确定,验证哈希,加密响应信息回发浏览器。
- 浏览器解密握手信息,并计算经过加密算法后的哈希值,如果与浏览器发送过来的哈希值一致,则加密交换数据。
7.2 HTTP和HTTPS的区别
- 1.HTTPS需要CA证书,HTTP不需要。
- 2.HTTPS密文传输,HTTP明文传输。
- 3.连接方式,HTTPS默认使用443端口,HTTP使用80端口。
八、Socket简介
Socket是对TCP/IP协议的抽象,是操作系统对外(网络程序)开放的接口 参考网址 。
8.1 Socket通信流程
8.2 基于TCP的Server/Client的通信实例:
-
1.服务器端需要创建socket,并绑定bind 65000的端口。并使用while死循环,监听端口有无响应,有响应后执行相关业务逻辑。
ServerSocket ss = new ServerSocket(port:65000) while(true){ Socket socket = ss.accpet(); /* 执行相关业务 */ }
-
2.客户端创建socket,并指定连接的服务器ip和端口号port 65000,获取输入和输出流,执行相关业务逻辑,最后关闭输入输出流和socket连接。
Socket socket = new Socket(host:"127.0.0.1",port:65000); //获取输入输出流 OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); /* 执行业务 */ //关闭输入输出流 is.close() os.close() //关闭socket连接 socket.close()
最后修改于时间:2020年10月15日