OSI 的七层模型分别是什么
- 物理层:底层数据传输,屏蔽掉具体传输介质和物理设备的差异,如网线;网卡标准。(比特流)
- 数据链路层:定义数据的基本格式,如何传输,如何标识;如网卡MAC地址。(帧)
- 网络层:定义IP编址,定义路由功能;如不同设备的数据转发。(包)
- 传输层:端到端传输数据的基本功能;如 TCP、UDP。(段)
- 会话层:控制应用程序之间会话能力;如不同软件数据分发给不同软件。
- 表示层:数据格式标识,基本压缩加密功能。
- 应用层:各种应用软件,包括 Web 应用。
TCP五层模型相比OSI七层模型,将OSI的应用层、表示层和会话层合为一层:应用层,其他不变。
TCP/IP的四层模型是什么
- 应用层:定义了信息交换的格式,消息会交给下一层传输层来传输(HTTP,SMTP,DNS)
- 运输层:为进程之间的通信提供通用的数据传输服务(TCP,UDP)
- 网际层:为分组交换网上的不同主机提供通信服务(IP,ARP,NAT)
- 网络接口层:看作是数据链路层和物理层的合体
应用层
DNS 是什么
DNS域名系统,将域名转换为IP地址,属于应用层协议,传输采用UDP协议。
DNS 的解析过程
DNS解析过程类似一颗树,主机向本地域名服务器一般是递归查询; 向根用域名服务器查询是迭代查询。
递归查询:本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文(即替该主机继续查询),而不是让该主机自己进行下一步的查询。
迭代查询:根域名服务器收到请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器,“你下一步应当向哪一个域名服务器进行查询”。
DNS 为什么用 UDP
其实 DNS 的整个过程是既使用 TCP 又使用 UDP。
当进行区域传送(主域名服务器向辅助域名服务器传送变化的那部分数据)时会使用 TCP,因为传送的数据量增多,而 TCP 允许的报文长度更长,为了保证数据的正确性,会使用基于可靠连接的 TCP。
当客户端向 DNS 服务器查询域名 ( 域名解析) 的时候,一般返回的内容不会超过 UDP 报文的最大长度,即 512 字节。用 UDP 传输时,不需要经过 TCP 三次握手的过程,从而大大提高了响应速度
HTTP协议是什么
HTTP是超文本传输协议,它是以TCP/IP为基础来传输HTML,文件图片等。 它本身处于应用层,端口号80。简单来说就是客户端和服务端进行数据传输的一种规则
- HTTP是基于浏览器/服务器架构;
- HTTP是无状态协议:HTTP本身并不保存用户的任何信息,也不会对传输的数据,状态信息进行持久化;
- HTTP是无连接协议:每次连接只处理一个请求,服务器处理完用户请求,即断开连接,借此节约传输时间。
HTTP缓存了解吗
http缓存指的是: 当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有“要请求资源”的副本,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。
常见的http缓存只能缓存get请求响应的资源
http缓存都是从第二次请求开始的。第一次请求资源时,服务器返回资源,并在respone header头中回传资源的缓存参数;第二次请求时,浏览器判断这些请求参数,命中强缓存就直接200,否则就把请求参数加到request header头中传给服务器,看是否命中协商缓存,命中则返回304,否则服务器会返回新的资源。
强缓存: 在缓存数据未失效的情况下(即Cache-Control的max-age没有过期或者Expires的缓存时间没有过期),那么就会直接使用浏览器的缓存数据,不会再向服务器发送任何请求。
协商缓存:当第一次请求时服务器返回的响应头中没有Cache-Control和Expires,或Cache-Control和Expires过期,或者它的属性设置为no-cache时(即不走强缓存),那么浏览器第二次请求时就会与服务器进行协商,与服务器端对比判断资源是否进行了修改更新。如果服务器端的资源没有修改,那么就会返回304状态码,告诉浏览器可以使用缓存中的数据,这样就减少了服务器的数据传输压力。
HTTP常用状态码
1xx:目前是协议的中间状态,还需要后续请求。
2xx:表示请求成功。
3xx:表示重定向状态,需要重新请求。
4xx:请求报文错误。
5xx:服务器错误。
常用状态码:
- 101 切换请求协议,从 HTTP 切换到 WebSocket
- 200 请求成功,有响应体
- 201 请求被成功处理并且在服务端创建了一个新的资源。比如POST创建一个新的用户。
- 301 永久重定向:比如网站的网址更换
- 302 临时重定向:比如网站的某些资源被暂时转移到另外一个网址
- 304 协商缓存命中
- 403 服务器禁止访问,一般针对非法请求。
- 404 资源未找到
- 400 请求错误,请求参数不合法、请求方法错误等。
- 500 服务器端错误
- 502 网关将请求转发到服务端,服务端返回错误的响应。
- 503 服务器繁忙
HTTP长连接和短连接的区别
在HTTP/1.0中采用短连接。客户端和服务器每进行一次HTTP通信,就建立一次连接,Connection: close
在HTTP/1.1默认采用长连接。Connection: keep-alive,就是保持连接。
长连接适用的场景:一些游戏/即时通讯场景应该使用长连接;
短连接适用的场景: Web【wapWeb/H5等】的http服务,长连接对于服务端来说会耗费一定资源。
HTTPS协议是什么
HTTPS 是安全通信的超文本传输协议。HTTPS 由 HTTP 进行通信,利用 SSL/TLS 来加密数据包。主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。HTTPS工作在TCP协议443端口
HTTPS 的工作过程
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL中使用了非对称加密,对称加密以及HASH算法。
1)浏览器将自己支持的一套加密规则发送给网站。
2)网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
a) 验证证书的合法性,否则会给出证书不受信的提示。
b) 如果证书受信任,浏览器会生成一串随机数的key,并用证书中提供的公钥加密。
c) 使用约定好的HASH算法计算握手消息(数字签名),并使用生成的key对消息进行加密,最后将之前生成的所有信息发送给网站。
4)网站接收浏览器发来的数据之后要做以下的操作:
a) 使用自己的私钥将信息解密取出密码key,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
b) 使用密码加密一段握手消息,发送给浏览器。
5)浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
浏览器与网站互相发送加密的握手消息并验证,是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。
对称加密与非对称加密的区别
对称加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方。
非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
什么是数字签名
数据的摘要消息进行一个加密,比如 MD5,得到一个签名,和数据一起发送。然后接收端把数据摘要进行 MD5 加密,如果和签名一样,则说明数据确实是真的。避免数据在传输过程中被替换
什么是数字证书
如果公钥也被替换,则仍然可以伪造数据。为了保证发送方的公钥是真的,CA 证书机构会负责颁发一个证书,里面的公钥保证是真的
HTTP 和 HTTPS 的区别
- 开销:HTTPS 协议需要到 CA 申请证书,一般免费证书很少,需要交费;
- 响应速度:HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 ssl 加密传输协议,需要消耗更多的 CPU 和内存资源;基于HTTP协议的响应更快
- 端口不同:HTTP使用80端口,HTTPS使用443端口;
- 安全性:HTTP 的连接很简单,是无状态的;HTTPS 协议是由 TLS+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全
HTTP1.0,1.1,2.0 的区别
HTTP/1.0:短连接。浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接
HTTP/1.1:长连接。TCP连接默认不关闭,可以被多个请求复用
HTTP2.0:
- 二进制格式。采用二进制而非文本格式;
- 完全多路复用。无序,不阻塞,一个连接就实现并行;(依赖二进制分帧)
- 报头压缩。减小开销;
- 服务端推送。服务器可以将响应主动“推送”到客户端缓存中。
HTTP请求的方式有哪些
- GET:用于从服务器获取资源。GET请求通过URL传递参数,将参数附加在URL的末尾,以查询字符串的形式发送给服务器。GET请求的特点是幂等性,即多次执行相同的GET请求,不会对服务器产生影响。
- POST:用于向服务器提交数据,通常用于新增资源或发送表单数据。POST请求将数据放在请求体中,而不是URL中。非幂等
- PUT:用于向服务器更新资源。将数据放在请求体中,并指定要更新的资源的URL。幂等
- DELETE:用于删除服务器上的资源。DELETE请求指定要删除的资源的URL。幂等
- PATCH:用于对服务器上的资源进行部分更新。PATCH请求类似于PUT请求,但只更新部分字段或属性。幂等
GET和POST的区别是什么
(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)
(2)post发送的数据更大(get有url长度限制)
(3)post能发送更多的数据类型(get只能发送ASCII字符)
(4)post比get慢。GET产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); POST产生两个TCP数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
(5)post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交),目的是资源的获取,读取数据
cookie和session的区别
cookie是客户端保持状态的方法;
session是服务器保持状态的方法;
(1)保存的位置不同:
cookie保存在浏览器端,session保存在服务端。
(2)使用方式不同
cookie:如果在浏览器端对cookie进行设置对应的时间,则cookie保存在本地硬盘中,此时如果没有过期,则就可以使用,如果过期则就删除。如果没有对cookie设置时间,则默认关闭浏览器,则cookie就会删除。
session:我们在请求中,如果发送的请求中存在sessionId,则就会找到对应的session对象,如果不存在sessionId,则在服务器端就会创建一个session对象,并且将sessionId返回给浏览器,可以将其放到cookie中,进行传输,如果浏览器不支持cookie,则应该将其通过encodeURL(sessionID)进行调用,然后放到url中。
(3)存储内容不同
cookie只能存储字符串(小文件),而session存储结构类似于hashtable的结构,可以存放任何类型。
(4)存储大小:cookie最多可以存放4k大小的内容,session没有限制。
(5)session的安全性要高于cooKie
如何保证cookie传输安全
- 使用HTTPS协议:HTTPS使用加密和身份验证机制来保护Cookie在传输过程中的安全性,防止被拦截和窃取。
- 设置Secure标记:将Cookie的Secure属性设置为true,表示该Cookie只能通过HTTPS连接发送,不会被非加密的HTTP连接传送。
- 设置HttpOnly标记:将Cookie的HttpOnly属性设置为true,限制JavaScript脚本对该Cookie的访问。这能有效防止跨站点脚本攻击(XSS)利用JavaScript代码获取Cookie值
- 进行安全编码:在将敏感信息保存到Cookie中时,应对其进行适当的加密和编码,以防止信息泄露和篡改。
- 定期更新和验证Cookie:定期更改关键Cookie的值,增加猜测和窃取的难度。同时,服务器端应对Cookie进行有效性验证,确保其合法性和完整性
token是什么
token 的认证方式类似于临时的证书签名, 并且是一种服务端无状态的认证方式, 非常适合于 REST API 的场景
token在客户端一般存放于localStorage,cookie,或sessionStorage中。在服务器一般存于数据库中
token的组成
- uid: 用户唯一身份标识
- time: 当前时间的时间戳
- sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
- 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库
token认证流程
token 的认证流程与cookie很相似
- 用户登录,成功后服务器返回Token给客户端。
- 客户端收到数据后保存在客户端
- 客户端再次访问服务器,将token放入headers中
- 服务器端采用filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码
分布式下的session共享问题
session是有状态的,一般存于服务器内存或硬盘中,session就会面对负载均衡问题,多服务器不共享session
- 可以将session存在一个服务器中来解决,但是就不能完全达到负载均衡的效果。
- Redis替代了每个服务器存储session,实现共享。
- 使用token,token是无状态的,token字符串里就保存了所有的用户信息
- 客户端登陆传递信息给服务端,服务端收到后把用户信息加密(token)传给客户端,客户端将token存放于localStroage等容器中。客户端每次访问都传递token,服务端解密token,就知道这个用户是谁了。(JWT实现)
浏览器中输入 URL 地址到显示主页的过程(HTTP通信过程)
- 用户输入网址
- DNS服务器进行域名解析
- 进行TCP三次握手
- 建立TCP连接
- 发送HTTP请求
- 服务器接受请求并返回HTTP报文
- 释放连接TCP连接:分长短连接情况
- 客户端浏览器解析HTML内容,渲染页面
这个过程中用到哪些层的哪些协议
应用层:DNS,UDP,HTTP
传输层:TCP
网络层:IP
网络接口层:OSPF
数据链路层:ARP
浏览器会解析URL地址,用DNS(应用层)将其转换为IP地址,DNS服务器是基于UDP(传输层)。
得到IP地址后,浏览器就要与服务器建立一个HTTP(应用层)连接。HTTP生成一个GET请求报文,利用TCP(传输层)传输。TCP数据包然后会发送给IP层(网络层),IP层通过路由选择协议,如OSPF(网络接口层)和交换机等找到目的主机IP,ARP协议将IP转化成主机的MAC地址(数据链路层)。
URI 和 URL 的区别是什么?
- URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
- URL(Uniform Resource Locator) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。
URL 是一种具体的 URI,它不仅唯一标识资源,而且还提供了定位该资源的信息
传输层
TCP协议的特点
(1)面向连接。双方传输数据之前,必须先建立一条通道。例如三次握手,四次挥手
(2)点对点。每一条TCP连接只能有两个端点(即两个套接字)
(3)提供可靠的传输服务。传送的数据无差错、不丢失、不重复、按序到达;
(4)提供全双工通信。允许通信双方的应用进程在任何时候都可以发送数据,因为两端都设有发送缓存和接受缓存;
(5)面向字节流。程序与TCP交互是一个个数据块,TCP把这些数据看成一连串无结构的字节流。
UDP协议的特点
(1)UDP是无连接的传输层协议;
(2)UDP使用尽最大努力交付,不保证可靠交付;
(3)UDP是面向报文的,对应用层交下来的报文,不合并,不拆分,保留原报文的边界;
(4)UDP没有拥塞控制,因此即使网络出现拥塞也不会降低发送速率;
(5)UDP支持一对一 一对多 多对多的交互通信;
(6)UDP的首部开销小,只有8字节.
TCP和UDP头部
TCP头部(20字节):
- 源端口号(16位):表示发送方的端口号。
- 目标端口号(16位):表示接收方的端口号。
- 序号(32位):用于对发送的每一个报文段进行编号,从而实现数据的有序传输。
- 确认号(32位):用于对接收到的报文段进行确认,确保接收方已经正确地接收到了数据。
- 数据偏移(4位):指出TCP头部的长度,以4字节为单位,最大值为15,即最长为60字节。
- 保留位(3位):预留位,保持为0。
- 标志(9位):用于描述当前报文段的状态,包括URG(紧急)、ACK(确认)、PSH(推送)、RST(重置)、SYN(同步)和FIN(结束)。
- 窗口大小(16位):用于控制窗口的流量控制,即告诉发送方接收方可以接收多少数据。
- 检验和(16位):用于检查TCP头部和数据是否有错。
- 紧急指针(16位):仅在URG标志被设置时有效,用于指示紧急数据的末尾位置。
- 选项(可变长度):用于在TCP协议中进行传输参数的协商和配置。
UDP头部(8字节):
- 源端口号(16位):表示发送方的端口号。
- 目标端口号(16位):表示接收方的端口号。
- 长度(16位):UDP报文段的长度,包括头部和数据部分。
- 检验和(16位):用于检查UDP报文段是否有错。
TCP 与 UDP 的区别
- 是否面向连接 :UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。
- 是否是可靠传输:远端主机在收到 UDP 报文后,不需要给出任何确认,并且不保证数据不丢失,不保证是否顺序到达。TCP 提供可靠的传输服务,TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。
- 传输效率 :由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多。
- 传输形式 : TCP 是面向字节流的,UDP 是面向报文的。
- 首部开销 :TCP 首部开销(20 ~ 60(options) 字节)比 UDP 首部开销(8 字节)要大。
- 是否提供广播或多播服务 :TCP 只支持点对点通信,UDP 支持一对一、一对多、多对一、多对多;
TCP 和 UDP 应用场景
UDP用于效率要求相对高,对准确性要求相对低的场景。,比如: 语音、 视频 、直播等等。
TCP 用于对传输准确性要求特别高的场景,比如文件传输、发送和接收邮件、远程登录等等。
使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?
运行于 TCP 协议之上的协议 :
- HTTP 协议 :超文本传输协议。
- HTTPS 协议 :更安全的超文本传输协议,身披 SSL 外衣的 HTTP 协议
- FTP 协议:文件传输协议,提供文件传输服务。
- SMTP 协议:简单邮件传输协议,用来发送电子邮件。
- POP3协议: 负责邮件接收的协议。
- Telnet 协议:远程登陆协议,通过一个终端登陆到其他服务器。
- SSH 协议 : 目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。
运行于 UDP 协议之上的协议 :
- DHCP 协议:动态主机配置协议,动态配置 IP 地址
- DNS : 域名系统。实际上 DNS 同时支持 UDP 和 TCP 协议。
- SNMP:简单网络管理协议,使用161号端口;
建立连接 TCP三次握手
- 一次握手 : 客户端发送带有 SYN(seq=x(isn)) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认;
- 二次握手 : 服务端发送带有 SYN+ACK(seq=y(isn),ack=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态
- 三次握手 : 客户端发送带有 ACK(ack=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入ESTABLISHED 状态,完成TCP三次握手。
标志位
ACK:确认序号有效。
SYN: 同步序列编号。发起一个新连接。
FIN:释放一个连接。
seq:数据包中第一个字节的序列号(isn:初始化序列号)
为什么要三次握手
三次握手的目的是建立可靠的通信信道,双方确认自己与对方的发送与接收是正常的。
- 第一次握手 :Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常
- 第二次握手 :Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
- 第三次握手 :Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常
确认双方的接受能力、发送能力是否正常。
指定自己的初始化序列号,为后面的可靠传送做准备。
为什么不是两次或四次
四次握手的过程:
- 1.A发送同步信号SYN+ A’s Initial sequence number
- 2.B确认收到A的同步信号,并记录A’s ISN到本地,命名B’s ACK sequence number
- 3.B发送同步信号SYN + B’s lnitial sequence number
- 4.A确认收到B的同步信号,并记录B’s lSN到本地,命名A’s ACK sequence number
很显然2、3步骤可以合并,只需要三次握手,可以提高连接的速度与效率。
二次握手的过程:
- 1.A发送同步信号SYN + A’s Initial sequence number
- 2.B发送同步信号SYN + B’s Initial sequence number + B’s ACK sequence number
A与B就A的初始序列号达成了一致。但是B无法知道A是否已经接收到自己的同步信号,如果这个同步信号丢失了,A和B就B的初始序列号将无法达成一致。
B此时也不知道自己发送、对方接收是否正常
数据丢失问题
第一个包,即A发给B的SYN中途被丢,没有到达B:
A会周期性超时重传,直到收到B的确认
第二个包,即B发给A的SYN +ACK中途被丢,没有到达A:
B会周期性超时重传,直到收到A的确认
第三个包,即A发给B的ACK中途被丢,没有到达B:
A发完ACK,单方面认为TCP为Established状态,而B显然认为TCP为Active状态:
- 1.假定此时双方都没有数据发送,B会周期性超时重传,直到收到A的确认,收到之后B的TCP连接也为Established状态,双向可以发包。
- 2.假定此时A有数据发送,B收到A的Data + ACK,自然会切换为established 状态,并接受A的Data。
- 3.假定B有数据发送,数据发送不了,会一直周期性超时重传SYN + ACK,直到收到A的确认才坷以发送数据。
断开连接 TCP四次挥手
- 第一次挥手 :客户端发送一个 FIN(SEQ=X) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送。然后,客户端进入 FIN-WAIT-1 状态。
- 第二次挥手 :服务器收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (SEQ=X+1)标志的数据包->客户端 。然后,此时服务端进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态。
- 第三次挥手 :服务端关闭与客户端的连接并发送一个 FIN (SEQ=y)标志的数据包->客户端请求关闭连接,然后,服务端进入LAST-ACK状态。
- 第四次挥手 :客户端发送 ACK (SEQ=y+1)标志的数据包->服务端并且进入TIME-WAIT状态,服务端在收到 ACK (SEQ=y+1)标志的数据包后进入 CLOSE 状态。此时,如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后,客户端也可以关闭连接了。
为什么要四次挥手
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。
- 第一次挥手 : A 告诉 B 没有数据要发了,需要断开连接
- 第二次挥手 :B 收到 A 的信息,向A发送确认数据包,这时候B可能还没有发完数据,不能断开连接
- 第三次挥手 :B 发送数据结束,向A 发送断开连接信息
- 第四次挥手 :A 收到 B 的断开信息,发送确认断开信息,B收到后断开,最后A断开连接
为什么不能把ACK 和 FIN 合并起来,变成三次挥手
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。
为什么第四次挥手客户端需要等待 2MSL(报文段最长寿命)时间后才进入 CLOSED 状态?
第四次挥手时,客户端发送给服务器的 ACK 有可能丢失,如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN。
MSL(Maximum Segment Lifetime) : 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。
TCP 如何保证传输的可靠性
- 首部校验和 : TCP 将保持它首部和数据的检验和。目的是检测数据在传输过程中的任何变化。
- 序列号,确认应答,超时重传:数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送方迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值。
- 流量控制 : TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。(滑动窗口)
- 拥塞控制 : 当网络拥塞时,减少数据的发送。
TCP 如何实现流量控制
TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。
接收窗口的大小是根据接收端处理数据的速度动态调整的。 如果接收端读取数据快,接收窗口可能会扩大。 否则,它可能会缩小。
TCP 如何实现拥塞控制
网络拥塞是指在计算机网络中,由于超过网络链路或节点的处理能力而导致的网络性能下降和通信延迟增加的现象。当网络中的数据流量超过网络设备处理的能力限制时,就会发生网络拥塞。
如果把拥塞窗口cwnd定的很大,那么发送端不停的发送数据,有可能导致网络拥塞。一般会有慢启动和拥塞避免和快速重传和快速恢复策略。
慢启动:定义拥塞窗口,一开始设为1,之后每经过一个往返时间 RTT,窗口大小乘2
拥塞避免:设置慢启动阈值sshthres。当前拥塞窗口大小达到这个阈值,每经过一个往返时间 RTT,拥塞窗口+1,以避免拥塞。
快速重传:
在 TCP 传输过程中,如果发生了丢包,接收端就会发送之前重复 ACK,比如 第 5 个包丢了,6、7 达到,然后接收端会为 5,6,7 都发送丢失包的 ACK,这个时候发送端受到了 3 个重复的 ACK,意识到丢包了,就会马上进行重传,而不用等到 RTO (超时重传的时间)
快速恢复:
当发送方连续收到了三次重复ACK时,就认为当前网络处于拥塞状态,就会进入快速恢复:
- 将拥塞阈值降低为拥塞窗口的一半(与协议有关);
- 将拥塞窗口的大小变为拥塞阈值;
- 接着拥塞窗口再线性增加,以适应网络环境;
拥塞控制和流量控制的区别是什么
- 目标不同:
- 拥塞控制的目标是确保网络中没有过多的流量导致网络拥塞,以维持网络的稳定性和可靠性。
- 流量控制的目标是确保发送方和接收方之间的数据传输速率匹配,以防止接收方无法及时处理大量的数据。
- 控制的位置不同:
- 拥塞控制主要由网络设备(如路由器、交换机)和端点(如计算机、服务器)共同实施,通过监测网络状态和调整数据发送速率来控制拥塞。
- 流量控制主要由通信的两个端点(发送方和接收方)共同实施,通过使用反馈机制来控制数据的发送速率。
- 作用范围不同:
- 拥塞控制是针对整个网络的全局问题,旨在避免网络范围内的拥塞发生,并保护整个网络的性能。
- 流量控制是发送方和接收方之间的点对点问题,旨在确保发送方的数据发送速率与接收方的数据处理速率相匹配。
- 反馈方式不同:
- 拥塞控制使用网络的拥塞指示信号(如丢包、延迟等)作为反馈,以调整数据发送速率。
- 流量控制使用接收方向发送方发送的确认信息(ACK)来指示发送方的数据发送速率。
ARQ 协议是什么
自动重传请求(Automatic Repeat-reQuest,ARQ)是 OSI 模型中数据链路层和传输层的错误纠正协议之一。
它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认信息,它通常会重新发送,直到收到确认或者重试超过一定的次数。
ARQ 包括停止等待 ARQ 协议和连续 ARQ 协议。
停止等待 ARQ 协议(自动重传请求 ARQ)
每发完一个分组就停止发送,等待对方确认(回复 ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组;
在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。
1) 无差错情况:
发送方发送分组,接收方在规定时间内收到,并且回复确认.发送方再次发送。
2) 出现差错情况(超时重传):
只要超过一段时间仍然没有收到确认,就重传前面发送过的分组(认为刚才发送过的分组丢失了)。若收到重复分组,就丢弃该分组,但同时还要发送确认。
3) 确认丢失和确认迟到
- 确认丢失 :确认消息在传输过程丢失。当 A 发送 M1 消息,B 收到后,B 向 A 发送了一个 M1 确认消息,但却在传输过程中丢失。而 A 并不知道,在超时计时过后,A 重传 M1 消息,B 再次收到该消息后采取以下两点措施:1. 丢弃这个重复的 M1 消息,不向上层交付。 2. 向 A 发送确认消息。
- 确认迟到 :确认消息在传输过程中迟到。A 发送 M1 消息,B 收到并发送确认。在超时时间内没有收到确认消息,A 重传 M1 消息,B 仍然收到并继续发送确认消息(B 收到了 2 份 M1)。此时 A 收到了 B 第二次发送的确认消息。接着发送其他数据。过了一会,A 收到了 B 第一次发送的对 M1 的确认消息(A 也收到了 2 份确认消息)。处理如下:1. A 收到重复的确认后,直接丢弃。2. B 收到重复的 M1 后,也直接丢弃重复的 M1。
连续 ARQ 协议
连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
优点: 信道利用率高,容易实现,即使确认丢失,也不必重传。
缺点: 不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5 条 消息,中间第三条丢失(3 号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。
网络层
ping命令是基于哪一层协议?原理是什么
PING 命令是一种常用的网络诊断工具,经常用来测试网络中主机之间的连通性和网络延迟。
ping是基于网络层的ICMP协议工作的。ICMP全称是互联网报文控制协议。
ICMP的功能是:确定IP包是否成功送达目标地址、以及失败原因,网络参数调优等。ICMP是IP协议的得力助手。
ICMP类型分为两大类:
- 差错报告
- 询问报告
IP和ICMP协议有什么区别
IP(Internet Protocol,网际协议) 是网络层的协议,主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。
IP协议和ICMP协议都工作于网络层,通常ICMP协议嵌入在IP协议中。IP协议本身不保证可靠性,ICMP是IP协议的一个补充,包括差错报告和询问报告两类。IP的检验和只计算报文头部,ICMP是计算报文头部和数据主体。
IP地址和MAC地址有什么区别
IP 地址主要用来网络寻址用的,就是大致定位你在哪里,而 MAC 地址,则是身份的唯一象征,通过 MAC 来唯一确认这人是不是就是你,MAC 地址不具备寻址的功能。
什么是IPv4和IPv6
IPv4和IPv6是不同类型的IP地址。它们的主要用途相同,标记不同的用户,并且让用户能通过IP进行通信。主要区别在于IPv6是最新一代的IP地址。
IPv4和IPv6的区别
- 地址长度:IPv4地址长度为32位,而IPv6地址长度为128位。
- 表示方式:IPv4用点分十进制,IPv6用以冒号分隔的十六进制数字
- 头部大小:IPv4为20字节,IPv6为40字节
- 地址数量:IPv6地址数量比IPv4大得多
- 数据包大小:IPv4数据包最大长度为64KB,而IPv6数据包最大长度为4GB。
- 安全性:IPv6支持IPSec (Internet Protocol Security)协议,可提供更强的安全性。
NAT 的是什么
NAT(Network Address Translation,网络地址转换) 主要用于在不同网络之间转换 IP 地址。它允许将私有 IP 地址(如在局域网中使用的 IP 地址)映射为公有 IP 地址(在互联网中使用的 IP 地址)或者反向映射,从而实现局域网内的多个设备通过单一公有 IP 地址访问互联网。
数据链路层
数据链路层有哪些协议
ARP :地址解析协议。根据IP地址获取物理地址
RARP:反向地址解析协议。根据物理地址获取IP地址