1.TCP/IP四层模型,OSI七层模型
TCP/IP则是四层的结构,相当于是对OSI模型的简化。
数据链路层,也有称作网络访问层、网络接口层。他包含了OSI模型的物理层和数据链路层,把电脑连接起来。
网络层,也叫做IP层,处理IP数据包的传输、路由,建立主机间的通信。
传输层,就是为两台主机设备提供端到端的通信。
应用层,包含OSI的会话层、表示层和应用层,提供了一些常用的协议规范,比如FTP、SMPT、HTTP等。
2.TCP /UDP 传输层协议
TCP
TCP是一种面向连接的、可靠的传输层协议。
tcp为啥是三次握手,四次挥手
三次握手才可以阻止重复历史连接的初始化 (客户端收到后可以根据自身的上下文,判断这是一个历史连接)
三次握手才可以同步双方的初始序列号
四次挥手:被动方 回复ACK后,要处理现有的请求完成后,才能发第三次挥手 FIN
TCP连接三次握手
1.一开始,客户端和服务端都处于CLOSED状态
2.先是服务端主动监听某个端口,处于LISTEN状态
3.客户端主动发起连接SYN,之后处于SYN-SENT状态
4.服务端收到发起的连接,返回SYN,并且ACK客户端的SYN,之后处于SYN-RCVD状态
5.客户端收到服务端发送的SYN和ACK之后,发送ACK的ACK,之后处于ESTABLISHED状态。
6.服务端收到ACK的ACK之后,处于ESTABLISHED状态。
:TCP连接释放四次挥手
1.当前A和B都处于ESTAB-LISHED状态。
2.A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。
3.B收到连接释放报文段后即发出确认,然后B进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时TCP连接处于半关闭状态,即A已经没有数据发送了。
从B到A这个方向的连接并未关闭,这个状态可能会持续一些时间。
4.A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文端。
5.若B已经没有向A发送的数据,B发出连接释放信号,这时B进入LAST-ACK(最后确认)状态等待A的确认。
6.A再收到B的连接释放消息后,必须对此发出确认,然后进入TIME-WAIT(时间等待)状态。请注意,现在TCP连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入CLOSED状态。
7。B收到A发出的确认消息后,进入CLOSED状态。
TIME_WAIT 状态
主动发起断开连接的一方 在第四次挥手时,进入 TIME-WAIT(时间等待)状态 持续2MSL(两个报文生命周期)
作用:1 为了保证连接的可靠关闭。如果server没有收到最后一个ACK,那么就会重发FIN。
2 识别后来的报文并丢弃
TCP怎么保证传输过程的可靠性?
校验和:发送方在发送数据之前计算校验和,接收方收到数据后同样计算,如果不一致,那么传输有误。
确认应答,序列号:TCP进行传输时数据都进行了编号,每次接收方返回ACK都有确认序列号。
超时重传:如果发送方发送数据一段时间后没有收到ACK,那么就重发数据。
连接管理:三次握手和四次挥手的过程。
流量控制:TCP协议报头包含16位的窗口大小,接收方会在返回ACK时同时把自己的即时窗口填入,发送方就根据报文中窗口的大小控制发送速度。
拥塞控制:刚开始发送数据的时候,拥塞窗口是1,以后每次收到ACK,则拥塞窗口+1,然后将拥塞窗口和收到的窗口取较小值作为实际发送的窗口,如果发生超时重传,拥塞窗口重置为1。这样做的目的就是为了保证传输过程的高效性和可靠性。
拥塞控制和流量控制
拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是:
慢启动 :cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探网络的拥塞情况),然后再逐渐增大cwnd,每次翻倍
拥塞避免 : ssthresh (慢开始门限)
当cwnd<ssthresh 时,使用慢开始算法。
当cwnd> ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。每次 +1
当cwnd= ssthresh 时,既可使用慢开始算法,又可使用拥塞避免算法(通常做法)。
快重传、快恢复
快重传:接受方未收到报文 发送ack给发送方,发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。
快恢复:是将cwnd设置为ssthresh减半后的值,然后执行拥塞避免算法,使cwnd缓慢增大。
流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
放法:滑动窗口
粘包
粘包是指发送方发送的若干数据到接收方,而接收方在接收数据时这些数据粘在一起,后一包数据头紧接着前一包数据尾部。
发生情况:1.发送端发送间隔小,数据量小
2.接收端速率过慢
解决:1.在数据发送前,计算数据量大小,并将结果发送给接收端
2.直接使用固定的四个字节来表示数据长度
3.约定字符串或者字符来分割包
UDP协议
UDP是无连接、不可靠的 面向数据报的,传输层协议
使用场景:
流媒体、在线游戏流量通常使用UDP。 实时视频流和音频流应用是可以接受偶的丢包,不能接受重传数据包带来的高延迟。
udp 不会粘包:UDP 是没有连接的,面向消息的,提供高效率服务。不会使用块的合并优化算法, 由于UDP支持的是一对多的模式,所以接收端的skbuff(套接字缓冲区)采用了链式结构来记录每一个到达的UDP包
HTTP 协议
HTTP协议
(超文本传输协议)是一种网络通信协议,它将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。默认端口:80
HTTPS协议:
HTTPS协议是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。默认端口:443
HTTP 请求和响应中的头部(Header)和主体(Body)包含了不同的信息。
加密通信:
HTTPS使用加密算法对通信数据进行加密,使得传输过程中的数据无法被窃听或篡改。常见的加密算法包括对称加密和非对称加密。对称加密用于加密数据,而非对称加密用于安全地交换对称加密所使用的密钥。
证书验证:
HTTPS使用数字证书来验证服务器的身份。服务器使用数字证书来证明其拥有的公钥,并通过数字签名保证证书的完整性。客户端在与服务器建立连接时会验证证书的有效性,确保通信的目标是预期的服务器,避免中间人攻击。
安全协商:
在建立HTTPS连接时,客户端和服务器会进行协商,选择适用的加密算法和密钥长度等参数,以确保通信的安全性和性能的平衡。这个过程称为TLS握手,它涉及到协议版本协商、密钥交换、身份验证和加密算法的选择等。
安全头部设置:
通过设置HTTP响应头部的安全策略,可以提高HTTPS的安全性。例如,可以使用HTTP Strict Transport Security(HSTS)头部来强制客户端在与服务器进行通信时始终使用HTTPS。还可以使用Content Security Policy(CSP)头部来限制页面中加载的资源,防止恶意脚本注入和跨站脚本攻击。
请求头部(Request Headers):
请求方法(GET、POST、PUT、DELETE 等)
请求的目标资源路径(URL 或 URI)
主机名(Host)
用户代理(User-Agent,标识请求的客户端软件、操作系统等信息)
接受的内容类型(Accept)
接受的语言(Accept-Language)
缓存控制(Cache-Control)
认证信息(Authorization,用于身份验证)
Cookie(用于在客户端和服务器之间传递状态信息)
响应头部(Response Headers):
状态码(Status Code,表示请求的处理结果)
内容类型(Content-Type,指示响应主体的媒体类型)
内容长度(Content-Length,指示响应主体的长度)
服务器信息(Server,标识响应的服务器软件)
缓存控制(Cache-Control)
Cookie(用于在客户端和服务器之间传递状态信息)
重定向信息(Location,用于重定向请求)
HTTP 主体(Body)通常包含了请求或响应的实际数据。主体的内容可以根据请求的类型和服务器的支持而有所不同:
请求主体(Request Body):
在 POST、PUT 等请求方法中,主体通常包含了要发送给服务器的数据,如表单数据、JSON 数据等。
响应主体(Response Body):
在响应中,主体包含了服务器返回给客户端的实际数据,如 HTML 内容、JSON 数据、文件内容等。
HTTP 头部提供了关于请求和响应的元数据信息,而主体则包含了实际的数据内容。这种分离使得 HTTP 协议灵活且可扩展,可以传输不同类型的数据和元数据信息。
响应状态码:
响应状态码由三位数字组成,第一个数字定义了响应的类别,且有五种类型
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
HTTP响应状态码列表:
常见的响应状态码:
200 - 请求成功,已经正常处理完毕
301 - 请求永久重定向,转移到其它URL
302 - 请求临时重定向
304 - 请求被重定向到客户端本地缓存
400 - 客户端请求存在语法错误
401 - 客户端请求没有经过授权
403 - 客户端的请求被服务器拒绝,一般为客户端没有访问权限
404 - 客户端请求的URL在服务端不存在
500 - 服务端永久错误
503 - 服务端目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
http各版本区别
HTTP/1.0
特性:
请求和响应格式: HTTP/1.0使用文本格式来传输请求和响应。请求由请求行、请求头和可选的请求体组成,而响应由状态行、响应头和实体组成。
支持多种HTTP方法:HTTP/1.0支持多种HTTP方法,包括GET、POST、HEAD、PUT、DELETE等。这些方法允许客户端与服务器进行不同类型的交互。
请求头和响应头:HTTP/1.0引入了请求头和响应头,用于传递关于请求或响应的附加信息。例如,请求头可以包含用户代理信息、Cookie等,而响应头可以包含内容类型、内容长度等。
**状态码:**HTTP/1.0引入了状态码来表示服务器对请求的处理结果。常见的状态码包括200(成功)、404(未找到)、500(服务器内部错误)等。
持久连接:在HTTP/1.0之前,每个请求都需要建立一个新的TCP连接。而在HTTP/1.0中,引入了持久连接(keep-alive)机制,允许在一个TCP连接上发送多个请求和响应。这样可以减少连接建立和关闭的开销,提高性能。
缓存控制:HTTP/1.0引入了一些缓存控制机制,允许客户端和服务器进行缓存的管理。例如,通过设置响应头中的Cache-Control字段,可以指定缓存的行为。
无状态:HTTP/1.0是无状态协议,即服务器不会保留客户端之前的请求信息。每个请求都是独立的,服务器只根据当前请求来处理。
优点:
简单易用: HTTP/1.0使用文本格式传输数据,易于理解和调试。
兼容性好: 由于HTTP/1.0是最早的版本之一,它具有广泛的兼容性,并且可以与旧版本的服务器和客户端进行通信。。
缺点:
性能较低:每个请求都需要建立和关闭TCP连接,导致了较高的延迟。而且每个请求只能获取一个资源,不能同时获取多个资源。
无法复用连接:由于每个请求都需要一个独立的TCP连接,在高并发情况下会导致服务器资源消耗过大。
http1.1
特性:
**持久连接:HTTP/1.1默认启用持久连接(keep-alive),允许在一个TCP连接上发送多个请求和响应。**这样可以减少连接建立和关闭的开销,提高性能。
管道化(pipelining):HTTP/1.1引入了管道化机制,允许客户端发送多个请求而无需等待每个请求的响应。这样可以减少延迟,并提高网络利用率。
分块传输编码(chunked transfer encoding):HTTP/1.1支持分块传输编码,允许服务器将响应分成多个块进行传输。这样可以在接收到部分响应时就开始渲染页面,而不需要等待整个响应完成。
虚拟主机支持:HTTP/1.1支持虚拟主机,允许在同一个IP地址上托管多个域名,并根据请求中的Host头部字段来区分不同的网站。
缓存控制增强:HTTP/1.1引入了更多的缓存控制机制,例如通过Cache-Control头部字段来指定缓存的行为,以及通过ETag和If-None-Match头部字段来进行缓存验证。
断点续传:HTTP/1.1支持断点续传,允许客户端在下载大文件时可以从上次中断的地方继续下载,而不需要重新下载整个文件。
优点:
性能改进:持久连接和管道化机制减少了连接建立和关闭的开销,提高了性能。
更高效的网络利用率:管道化机制允许同时发送多个请求,提高了网络利用率。
更灵活的缓存控制:HTTP/1.1引入了更多的缓存控制机制,使得缓存更加灵活和高效。
缺点:
队头阻塞(head-of-line blocking):由于HTTP/1.1使用单个TCP连接来发送多个请求和响应,如果某个请求或响应被阻塞或丢失,后续的请求或响应也会被阻塞。这种情况称为队头阻塞,可能导致性能下降。
无法处理大量并发请求:由于HTTP/1.1仍然使用单个TCP连接来处理请求和响应,当有大量并发请求时会导致服务器资源消耗过大。
http2.0
特性:
1**. 二进制传输:HTTP/2.0使用二进制格式而不是文本格式来传输数据。这样可以提高传输效率和解析速度。**
-
**多路复用(multiplexing):**HTTP/2.0允许在一个TCP连接上同时发送多个请求和响应。这样可以减少连接建立和关闭的开销,并提高网络利用率。
-
头部压缩:HTTP/2.0使用HPACK算法对请求和响应头部进行压缩,减少了数据传输的大小。
-
服务器推送(server push):HTTP/2.0允许服务器在客户端请求之前主动推送相关资源。这样可以减少客户端发送额外请求的次数,提高页面加载速度。
-
流量控制:HTTP/2.0引入了流量控制机制,允许客户端和服务器控制数据流的速率,避免了过载或拥塞情况的发生。
-
优先级(priority):HTTP/2.0允许客户端指定请求的优先级,以确保重要资源能够更快地加载。
-
安全增强:HTTP/2.0要求使用TLS加密,提供了更好的安全性和隐私保护。
优点:
性能改进:多路复用和头部压缩减少了连接建立和数据传输的开销,提高了性能。
更高效的网络利用率:多路复用和服务器推送机制提高了网络利用率,减少了延迟。
更好的用户体验:页面加载速度更快,用户可以更快地获取到所需的内容。
安全性增强:HTTP/2.0要求使用TLS加密,提供了更好的安全性和隐私保护。
由于二进制传输,每个帧都带了一个头部,记录了流的ID,这样做就能够准确的知道这一帧数据是属于哪个流的。这样就真正的解决了共享TCP连接时的队头阻塞问题,实现了真正的多路复用
不仅如此,由于传输时是以帧为单元传输的,无论是响应还是请求,都可以实现并发处理,即不同的传输可以交替进行。由于进行了分帧,还可以设置传输优先级。
HTTP3:0
基于 QUIC 协议(Quick UDP Internet Connections)。
使用 UDP 协议,提供更低的延迟和更好的性能。
支持多路复用、头部压缩、服务器推送等特性。
支持连接迁移,即在不同网络之间切换时保持连接的活动状态。
具备更好的安全性,使用 TLS 1.3 加密通信。
一次http 请求过程
一、http请求的完整过程简述
1、域名解析:使用DNS协议进行域名解析
2、建立连接:发起TCP三次握手
3、发起http请求:建立TCP连接成功后,浏览器发起http请求
4、响应http请求:服务端响应http请求,浏览器得到返回response
5、解析response:浏览器解析response,并请求其它的资源(如js、css等)
6、浏览器渲染展示页面:浏览器根据内核对页面进行渲染展示
cookie 和 session 的区别
cookie 和session 的作用 : http 特点为无状态 ,cookie 和session 为了 解决无状态的问题,而存储用户的信息。
浏览器请求时 :求情头部会带上cookie信息。cookie中会存有 session id ,服务器根据 session id 来识别 对饮的 session ,session 过期时间 会根据回话持续而重置时间
(1)Cookie以文本文件格式存储在浏览器中,而session存储在服务端,用来保持服务器的身份状态。
(2)cookie的存储限制了数据量,只允许4KB,而session是无限量的
(3)我们可以轻松访问cookie值但是我们无法轻松访问session值,因此它更安全(通过sessionID获取session)
BIO/NIO/AIO
BIO:同步阻塞IO
NIO:同步非阻塞IO
AIO:异步非阻塞IO
那么你怎么理解同步和阻塞?
同步异步:重点在用户态,用户是否等待,等待则未同步,不等待区干别的则为异步
阻塞非阻塞:重点在内核,内核拷贝不数据到用户,则为阻塞,拷贝为非阻塞
IO多路复用
IO 多路复用是一种同步 IO 模型,实现一个线程可以监视多个文件句柄,一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作
IO ;指网络请求 多路指多个TCP连接(即 socket 或者 channel),复用指复用一个或几个线程。
epoll
1、epoll_create:创建内核事件表()(红黑树)
2、epoll_ctl:添加或移出监控的fd和事件类
3、 epoll_wait: 绑定回调事件 内核向事件表的fd绑定一个回调函数
4、当监控的fd活跃时,会调用回调函数把事件加到一个活跃事件队列里
5、最后在epoll_wait 返回的时候内核会把活跃事件队列里的fd和事件类型返回给应用进程
select 和 poll 为 阻塞,epoll为 非阻塞