目录
一、谈一谈对OSI七层模型和TCP/IP四层模型的理解?
首先分层的原因是为了将计算机网络分为多层结构,每一层都有每一层的作用与规则,能够更好的进行网络连接。就好比发快递,从快递员从你手里拿到快递再到快递送到快递的网点进行分拣、运输到目的地的处理中心、最后到接收人收到快递这个过程。
OSI七层模型是对计算机网络的一种理想化模型,分别为:
物理层是通过网线、光缆这种物理方式将电脑连接起来,通过比特流传输。
数据链路层是将比特流封装成数据帧,对0、1进行分组。
网络层是决定数据在网络中的游走路径。
传输层是通过tcp或udp协议来为两台主机提供数据传输服务。
会话层是负责管理应用程序之间的会话,也就是会话的建立、维护和重连。
表示层是为了是数据能够被其他计算机所能理解转换成的另一种格式比如文字、视频、图片等。
应用层为最高层是最终呈现给用户的界面。
而TCP/IP四层模型是实际上的模型分层,也是对七层模型的简化版,为应用层、传输层、网络层、数据链路层。
其中应用层常见的协议有DNS域名协议、HTTP协议、邮件传输协议(SMTP、POP3、IMAP4等)、FTP传输协议等。
传输层常见的协议为TCP协议与UDP协议。
二、谈一谈TCP协议的三次握手过程?
第一次握手由客户端向服务端发送一个TCP数据包,其中首部中SYN=1,ACK=0,表示这是一个请求连接数据包。
第二握手由服务端向客户端发送,其中SYN=1,ACK=1,表示服务端同意连接。
第三次握手是由客户端再次向服务端发送,其中SYN=0,ACK=1。表示双方都同意连接,并且确认收到服务端的确认数据包。
三、TCP协议为什么要三次握手?两次、四次不行吗?
三次握手是为了避免重复连接,并且通过三次连接可以获得一个可靠的序列号seq。
如果只有两次握手的话,服务端并没有收到客户端的确认数据包、并不知到客户端是否收到服务端的确认数据包,而且无法获得初始化的序列号seq。
如果四次的话又会有些浪费资源。
四、谈一谈TCP协议的四次挥手过程?
第一次挥手由客户端向服务端发送,首部中FIN=1,ACK=0,表示这是一个请求断开的与服务端的连接。
第二次挥手是由服务端向客户端发送,其中FIN=0,ACK=1,表示确认收到客户端的发送的请求断开报文。此时客户端对服务端的连接就已经释放了,客户端只能接收服务端的数据包,不能发送。而服务端并没有释放,既可以接收也可以释放。
第三次挥手还是由服务端向客户端发送,其中FIN=1,ACK=1,表示服务端已经没有要向客户端发送的数据了,并释放与客户端之间的连接。此时服务端不能向客户端发送数据了,但能接收。
第四次挥手是由客户端收到对服务端的连接释放报文后,向服务端发送,其中ACK=1,FIN=0,表示确认收到收到释放报文。同意服务端释放连接。
五、什么是流量控制?
流量控制是指接收方对于发送方发送速率的一种控制。
因为每一方都有一块固定大小的缓存空间,而接收方需要要求发送方不能发送超过接收方缓存容量的数据。接收方来不及处理发送方的数据,就会提示对方降低发送速率,防止数据包丢失。
而TCP是利用滑动窗口来进行流量控制的。在确认报文中有一个窗口字段就是设置发送方的窗口大小,从而影响发送速率。
六、什么是滑动窗口?
因为如果每发送一个数据,都要等收到对方的确认收到后,才发送下一个数据的话,这样的通信效率是很慢的。而TCP协议就引入了窗口的概念。滑动窗口就是TCP协议用于实现流量控制的一种机制。
在发送发和接收方都会维护着各自的缓冲区,这个缓存区就叫窗口。窗口大小是由接收方首部中窗口这个字段来决定的。
在发送方的窗口中分别有四个区域,已经收到确认的数据、发送但没有被确认的数据、未发送但在缓存范围内的数据、未发送但超出缓存范围的区域,窗口会随着发送数据被确认而向着未发送的区域滑动。
而接收方的窗口分为成功接收并确认的数据、未收到但可以确认的数据、未收到但超出窗口范围的数据。接收方也会随着收到数据并确认后窗口向着未收到移动。接收方可以通过改变窗口大小来控制发送的速率,从而实现流量控制。
七、什么是拥塞控制?
发送方需要维护一个叫拥塞窗口的状态量来决定可以同时发送多少数据包。而TCP主要通过四个算法来进行拥塞控制:
慢开始:拥塞窗口从1开始已指数的方式增长。
拥塞避免:是指当拥塞窗口的值大于慢开始门限(ssthresh)时,会进入拥塞避免,拥塞窗口的增长会从指数增长改为每次只加一的线性增长。
快重传:是指在发送拥塞开始后已经开始出现丢包,而处理丢包的方式为超时重传(发送后的时间已经到达RTO还没收到确认数据包)时,会先将慢开始门限的值改为拥塞窗口值的一半,然后将拥塞窗口的值改为1,重新进入慢开始。
快恢复:是指如果进行快重传后(收到3个重复的确认数据包),会将慢开始门限改为原来的一半,然后继续执行拥塞避免。
八、TCP和UDP有什么区别?
TCP是面向连接的,仅支持一对一通信,并且是可靠性传输,而UDP是无需连接,支持一对一、一对多、多对一、多对多,通信,不保证可靠性。但是传输效率要比TCP高。首部需要8个字节,而TCP的首部为20-60字节。
九、如何保证传输过程的可靠性
确认应答和序列号:TCP在每次传输时都进行了编号,接收方收到数据后会通过ACK=1来进行确认序列号。
超时重传:如果如果发送方在一段时间都没有接收到ACK确认,那么会重发数据。
校验和:发送方会在发送前通过传输的数据计算一个校验和,接收也会对传输过来的数据进行计算出校验和,如果校验和相同,则说明数据完整传输。
连接管理:发送发和接收方连接时会发生3次握手,断开时会发生四次挥手。
流量控制:接收可以通过窗口值来控制发送方的发送速率。
拥塞控制:通过慢开始、拥塞避免、快重传、快恢复四个算法来进行拥塞控制避免网络中发送的数据包过多,发送丢包。
十、浏览器请求一个网址的过程
首先通过DNS服务器把域名解析成IP地址,通过IP和子网掩码判断是否属于同一个子网。
应用层构造出http报文,传输层添加tcp头部,网络层添加ip头部、数据链路层添加mac头部。
最后数据经过路由器、交换机转发,最终到目标服务器,反向解析数据获得http报文,最终响应。
十一、谈谈对HTTP协议的理解
http协议是应用层的协议,他是基于浏览器-服务器架构工作,浏览器通过url路径向服务器发起请求,服务器接收到请求后,向浏览器响应信息。
十二、谈谈GET和POST的区别
首先GET和POST都是HTTP协议的两种请求方法,都是基于TCP连接来进行通信。
GET用于获取数据,POST用于提交数据。
GET在URL路径上传参,POST在请求体中提交数据。
GET的报文头开头GET,POST报文头开头是POST。
十三、谈谈HTTP协议有哪些请求方式
GET:用于获取资源,他是从url路径传参。
POST:用于提交数据,通过在请求体中提交数据。
PUT:用于修改资源。
DELETE:用于删除资源。
HEAD:用于获取响应消息报头。和GET类似,但不返回响应报文的内容。
OPTIONS:查询支持的方法。查询能够支持url的方法。
十四、谈谈HTTPS的工作原理
浏览器请求https网站,服务器收到请求,选择浏览器支持的加密和hash算法,同时返回数字证书给浏览器,其中包括颁发机构、网址、证书有效期、公钥等有效信息。
浏览器对证书进行校验,如果有问题,则会发出警告信息。否则,生成随机密钥,使用证书中的公钥进行加密,发给服务器。
服务器收到后,使用私钥进行解密获取随机密钥,使用随机密钥对网页内容加密,返回给浏览器。
浏览器最后使用随机密钥和之前确定的加密方式进行解密,得到最终网页内容。
十五、HTTP协议和HTTPS协议的区别
HTTP是明文传递,存在安全风险。HTTPS则通过SSL安全协议,为密文传递,解决了安全问题。
HTTP连接简单,TCP三次握手即可传输。HTTPS除了TCP三次握手,还需要SSL握手才能密文传递。
HTTP的默认端口为80。HTTPS的默认端口为443。
十六、HTTP和TCP有什么区别
HTTP是应用层的协议,TCP是传输层的协议。
HTTP是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据时,会发出一次HTTP请求,HTTP会通过TCP建立起一个到服务器的连接通道,当本次请求完成后,通道会断开。
十七、TCP拆包粘包问题怎么出现的,怎么解决
因为TCP协议是面向连接的传输协议,其数据传输是基于字节流的。发送端可以一次性发送不定长的数据,接收也可以一次性提取不定长的数据,这种传输方式是无保护数据边界的,所以粘包则是指多次写入的数据封装成一个数据包进程传输,拆包是指程序写入的数据大于发送缓冲区的大小只能将数据拆分发送。
解决方法:
可以在缓冲区中不满就立刻发送数据。
每条数据都实现约定好格式(开始符、结束符)。
发送数据时将数据长度一起发送,例如规定一下每条数据的前四位是数据的长度。这样就能根据长度来判断起始和结束位置。
十八、常见状态码
200成功、400说明客户端请求的报文有问题、403服务器禁止访问该资源、404访问资源不存在、405请求方式错误、500服务器发生内部错误、503服务器当前很忙无法响应。
十九、http请求头内容(首部字段)
- Host字段:浏览器发送http请求时,用来指定服务器的域名。
例如:Host : www.apesource.com - Content-Length字段:服务器在响应数据时,会通过 Content-Length 字段,表明本次响应数据的长度。
例如:Content-Length: 1000 - Connection 字段:Connection字段用于浏览器要求服务器使用长连接,以便其他请求复用该连接。
例如:Connection: keep-alive - Content-Type 字段:Content-Type 字段用于服务器响应时,告诉浏览器,本次响应数据的内容类型。
例如:Content-Type: text/html; charset=utf-8 - Accept 字段:Accept 字段用于浏览器发起请求的时候,声明可以接受哪些响应数据格式。
例如:Accept: */* - Content-Encoding 字段:Content-Encoding 字段说明数据的压缩方法,表示服务器响应的数据使用的压缩格式。
例如:Content-Encoding: gzip - Accept-Encoding 字段:客户端在请求时,用 Accept-Encoding 字段说明自己可以接受哪些压缩方法。
例如:Accept-Encoding: gzip, deflate
二十、Tcp首部
源端口:表示发送方的发送端口。
目的端口:表示接收方的接收端口。
序号:指的是本报文段所发送的数据报文第一个字节序号,代表每次数据发送的位置。
确认号:确认号是指接收方向发送方一个确认报文段,通过该报文中的确认号,告诉发送方下一个要发送的报文段数据中第一个字节的序号。
数据偏移:数据部分距离报文首部的偏移量
保留:保留为今后使用,一般设置为 0。
控制位:用于传输过程中,传递控制标志位,用来说明本报文段的性质。
窗口:窗口代表接收窗口,接收方通过报文段首部的接收窗口值,告知发送方:从本报文段首部中的确认号算起,允许对方发送的数据量(单位是字节),用于限制发送方发送数据量。
检验和:它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。
紧急指针:仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数(紧急数据放在本报文段数据的最前面)。
二十一、RPC和HTTP之间的区别
RPC和HTTP都是网络协议,用于系统之间的通信和交互。但二者有以下主要区别:
1. 通信方式
- RPC:远程过程调用,是一种进程间通信方式。双方建立链接后,一个进程可以直接调用另一个进程的函数。
- HTTP:超文本传输协议,是一种客户端和服务器之间的请求-响应模式。客户端发送请求,服务器返回响应,两者连接后立即断开。
2. 传输协议
- RPC:可以使用TCP或UDP作为传输协议。
- HTTP:使用TCP作为传输协议。
3. 数据格式
- RPC:通常使用自定义的数据格式,比如XML、JSON等。
- HTTP:使用标准的MIME类型,如HTML、XML、JSON、图片等多种格式。
4. 连接方式
- RPC:双方在通信期间会持续连接。
- HTTP:采用无连接的传输协议,每次连接后立即断开,下次通信需要重新建立连接。
5. 应用场景
- RPC:适用于内部系统集成,提供服务的调用和响应。
- HTTP:适用于Web应用,网页访问和文件传输。
注:本篇文章都是我自己的理解,可能用词和语句不够严谨,如有错误请评论指正,谢谢!(持续更新中......)