计网相关笔记
OSI七层
三次握手四次挥手
三次握手
前两次不可携带数据,第三次可携带数据
- 第一次确认客户端的发送功能
- 第二次确认服务器的接受和发送功能
- 第三次确认客户端的接收功能
四次挥手
第一次客户端向服务器发送连接释放请求关闭,客户端进入终止等待1,服务端就进入了CLOSE-WAIT(关闭等待)状态
第二次服务器告诉客户端已接受到请求,但可能还有数据没法送完,需要等待一定时间再关闭.此时处于半关闭状态。。此时服务器发送数据客户端依然要接受。客户端进入终止等待2
第三次服务器向客户端发送连接释放,服务器进入最后确认状态
第四次客户端发送确认,客户端进入时间等待状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器收到确认后,立即进入CLOSED状态.
为什么不能只进行二次握手
3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
把三次握手改成仅需要两次握手,若又网络堵塞很容易造成资源浪费。
计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
客户端在第一次握手时报文在网络中堵塞,因没收到ack触发重传机制再发一个握手报文,然后服务端收到了发送一个握手,然后进行对话,没多久结束了tcp通道,此时堵塞的那个报文再次到达服务端,此时服务端又重新确认,但客户端已确认结束不予理睬,此时服务端再次开始tcp通道等待链接,造成资源浪费
为什么连接的时候是三次握手,关闭的时候却是四次挥手?
答:当服务端收到FIN报文时,可能还有数据没有发送完,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步挥手。
为什么客户端在第四次挥手后没有直接关闭tcp而是等待2MSL(最大报文段生存时间)
虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
tcp突然出现故障断开怎么办 tcp是每发一次请求就进行一次三次握手吗
在http1.1后出现了长连接,也就是keep-alive,tcp设有一个保活计时器,服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
一个tcp可以进行处理多少个http请求
- 在http1.1之前每个tcp只能处理一个http请求,之后http1.1引入了管道化机制,客户端发送http可以在一个TCP中发送多个http请求,但服务端响应只能串行处理返回,这也引出了HTTP队头阻塞的问题
- 在HTTP2.0引入了多路复用和二进制编码,一个 TCP 连接中可以存在多条流,而每个http请求会分成一个或多个帧,分布在多个流里运输,到达接收方后先缓存,再根据帧上的标识合并,通过这个标识可以知道属于哪个请求
TCP的确认机制
接收方成功接收到数据后,会回复一个ACK数据包进行确认,如果收不到会进行重传机制
TCP数据包中的序列号(Sequence Number)不是以报文段来进行编号的,而是将连接生存周期内传输的所有数据当作一个字节流,序列号就是整个字节流中每个字节的编号。一个TCP数据包中包含多个字节流的数据(即数据段),而且每个TCP数据包中的数据大小不一定相同。在建立TCP连接的三次握手过程中,通信双方各自已确定了初始的序号x和y,TCP每次传送的报文段中的序号字段值表示所要传送本报文中的第一个字节的序号。则seq这个packet的数据部分的第一位应该在整个data stream中所在的位置。
TCP的报文到达确认(ACK),是对接收到的数据的最高序列号的确认,并向发送端返回一个下次接收时期望的TCP数据包的序列号(Ack Number)。例如,主机A发送的当前数据序号是400,数据长度是100,则接收端收到后会返回一个确认号是501的确认号给主机A。
TCP提供的确认机制,可以在通信过程中可以不对每一个TCP数据包发出单独的确认包(Delayed ACK机制),而是在传送数据时,顺便把确认信息传出,这样可以大大提高网络的利用率和传输效率。同时,TCP的确认机制,也可以一次确认多个数据报,例如,接收方收到了201,301,401的数据报,则只需要对401的数据包进行确认即可,对401的数据包的确认也意味着401之前的所有数据包都已经确认,这样也可以提高系统的效率。
HTTP/2 并没有解决 TCP 的队首阻塞问题,它仅仅是通过多路复用解决了以前 HTTP1.1 管线化请求时的队首阻塞
TCP阻塞控制
滑动窗口:接收方通过通告发送方自己的可以接受缓冲区大小(这个字段越大说明网络吞吐量越高),从而控制发送方的发送速度。
拥塞窗口:拥塞窗口是决定任何时候可以发出的字节数的因素之一。拥塞窗口由发送方维护,是阻止发送方和接收方之间的链路因流量过多而过载的一种手段。这不应与发送方维护的滑动窗口相混淆,滑动窗口的存在是为了防止接收方过载。拥塞窗口是通过估计链路上有多少拥塞来计算的。
慢开始
初始cwnd=1(此时表示的是报文段的个数,而不是真正传输时使用的字节流),每收到一个确认报文段,cwnd+1;为了防止拥塞窗口cwnd增长过大而引起网络拥塞,设置一个慢开始门限ssthresh。
1.当cwnd<ssthresh,使用上述的慢开始算法
2.当cwnd>ssthresh,停止使用慢开始,使用拥塞避免算法
3.当cwnd==ssthresh,两者都可以使用
拥塞避免
让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd+1,而不是加倍(也就是收到两个,四个确认,仍然+1),这样cwnd就按线性增大
快重传
发送端在收到3个重复无序的ACK时候,它假定数据包丢失并重传该数据包,而无需等待重传计时器到期。
而在此时,拥塞窗口的变化过程如下:
- ssthresh设置为拥塞窗口的1/2
- 拥塞窗口大小设置为ssthresh
- 重新进入拥塞避免阶段
快恢复
- 当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段大小。
- 每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发送1个分组(如果新的cwnd允许发送)。
- 当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个ACK应该是在进行重传后的一个往返时间内对步骤1中重传的确认。另外,这个ACK也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。
如果发生超时重传,则置ssthresh为当前cwnd的一半,cwnd = 1,重新进入慢启动阶段。
收到非重复ACK即退出快恢复重新进入拥塞避免
tips:由于接收方有一个rwnd,也就是接收窗口,那么实际上,发送方窗口的上限=min(rwnd,cwnd)
流量控制
拥塞控制
如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。流量控制根本目的是防止分组丢失,它是构成TCP可靠性的一方面。
如何实现流量控制?
由滑动窗口协议(连续ARQ协议)实现。滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。主要的方式就是接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。
拥塞控制和流量控制的区别
拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是:( 1 )慢开始、拥塞避免( 2 )快重传、快恢复。
流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
TCP Fast Open
如果客户端和服务端同时支持 TCP Fast Open 功能,那么在完成首次通信过程后,后续客户端与服务端 的通信则可以绕过三次握手发送数据,通过cookie证明先前与客户端 IP 地址的三向握手已成功完成,这就减少了握手带来的 1 个 RTT 的时间消耗。
tcp的长连接和短连接 保活机制-keepalive
短连接即数据包发送完成后自己断开 长连接在发包完毕后,会在一定时间内保持连接—keepalive
keepalive工作原理:
若在一个给定连接上,两小时(默认)之内无任何活动,服务器便向客户端发送一个探测段。(我们将在下面的例子中看到探测段的样子。客户端主机必须是下列四种状态之一:
- 客户端主机依旧活跃(up)运行,并且从服务器可到达。从客户端TCP的正常响应,服务器知道对方仍然活跃。服务器的TCP为接下来的两小时复位存活定时器,如果在这两个小时到期之前,连接上发生应用程序的通信,则定时器重新为往下的两小时复位,并且接着交换数据。
- 客户端已经崩溃,或者已经关闭(down),或者正在重启过程中。在这两种情况下,它的TCP都不会响应。服务器没有收到对其发出探测的响应,并且在75秒之后超时。服务器将总共发送10个这样的探测,每个探测75秒。如果没有收到一个响应,它就认为客户端主机已经关闭并终止连接。
- 客户端曾经崩溃,但已经重启。这种情况下,服务器将会收到对其存活探测的响应,但该响应是一个复位,从而引起服务器对连接的终止。
- 客户端主机活跃运行,但从服务器不可到达。这与状态2类似,因为TCP无法区别它们两个。它所能表明的仅是未收到对其探测的回复。
tcp和udp的区别
tcp是面向连接的协议,在收发数据前,要和对方建立可靠的连接,即三次握手,面向字节流,有拥塞控制和流量控制,首部开销大,传输速度会比udp慢,但准确性高,适用于要求可靠传输的应用,例如文件传输
而udp是无连接的协议,可直接发送信息,不使用流量控制和拥塞控制,面向报文的,对应用层交下来的报文既不合并,也不拆分,适用于实时应用(IP电话、视频会议、直播等)
TCP为了可靠性保证,增加了3次握手4次挥手,复杂的拥塞控制,以及流量控制,让网络传输的延迟进一步增加。
HTTPS
https在http协议基础上加了一层SSL、TLS(升级版的SSL,SSL3.0就是tls1.0)协议进行加密。
https端口为443 http端口为80
在 TLS 中使用了两种加密技术,分别为:对称加密和非对称加密。
对称加密:
对称加密就是两边拥有相同的秘钥,两边都知道如何将密文加密解密。
非对称加密:
有公钥私钥之分,公钥所有人都可以知道,可以将数据用公钥加密,但是将数据解密必须使用私钥解密,私钥只有分发公钥的一方才知道。
为什么不直接用非对称加密:
因为非对称加密损耗的性能比对称加密大
具体过程(TLS 1.2 )
- 客户端发送一个随机值,加密套件(对称、非对称、hash加密算法,SSL或TLS版本号)
- 服务端收到客户端的随机值,自己也产生一个随机值,并根据客户端需求的协议和加密方式来使用对应的方式,发送自己的证书(如果需要验证客户端证书需要说明)
- 客户端收到服务端的证书并验证是否有效,验证通过会再生成一个随机值(pre Master-Secret),通过服务端证书的公钥去加密这个随机值并发送给服务端,如果服务端需要验证客户端证书的话会附带证书
- 服务端收到加密过的随机值并使用私钥解密获得第三个随机值
这时候两端都拥有了三个随机值,可以通过这三个随机值按照之前约定的加密方式生成Master-secret,用相同的Master-secret和相同的对称加密算法生成秘钥和secret key(用于做Hash摘要),这时因为生成对称加密密钥的条件两方相同,所以最后生成的秘钥虽然没有通过传输,两方也是相同的(避免了对称加密过程中的秘钥泄露问题)。接下来的通信就可以通过该密钥来加密解密
开始加密数据时客户端加密数据发给服务端同时会带上用secret key为介质做的Hash值(为了防止数据被篡改)。服务端解密数据后用secret key对数据做Hash并同发送来的Hash作对比,如果相同则通过验证。
证书验证流程:
在 1.3 协议中,首次建立连接只需要一个 RTT(来回),后面恢复连接不需要 RTT 了,(将后续的密钥信息放在应用数据报上)。
会话恢复(第二次后)
(通过sessionId或者sessionTicket(会话标识符、证书、密码套件和主密钥等,加密后生成一个ticket票据))等减少到0个 RTT(附带在应用数据包)。
TCP三次握手和TLSv1.2 四次握手
HTTPS 是先进行 TCP 三次握手,再进行 TLSv1.2 四次握手
但当满足:
- 客户端和服务端都开启了 TCP Fast Open 功能,且 TLS 版本是 1.3;
- 客户端和服务端已经完成过一次通信;
HTTPS 中的 TLS(1.3) 握手过程可以同时进行三次握手
浏览器缓存 强缓存 协商缓存 启发式缓存
缓存的位置 :
- 内存缓存
- 硬盘缓存
- (service worker(以让开发者自己控制管理缓存的内容以及版本) service worker 是什么?看这篇就够了 - 知乎 (zhihu.com))
一个服务器与浏览器之间的中间人角色,如果网站中注册了service worker那么它可以拦截当前网站所有的请求,进行判断(需要编写相应的判断程序),如果需要向服务器发起请求的就转给服务器,如果可以直接使用缓存的就直接返回缓存不再转给服务器。从而大大提高浏览体验。
缓存的分类
强缓存
通过 expires Cache-Control字段判断是否命中强缓存
- expires 该字段表示一个绝对时间的 GMT 格式字符串,代表着这个资源的失效时间。在此时间之前,则缓存未失效。
- Cache-Control 当中max-age为资源有限时间 ,其中还有其他属性
- no-cache:需要进行协商缓存,发送请求到服务器表示确认是否使用缓存
- no-store:禁止使用缓存,每一次都要重新请求
- public:可以被所有用户缓存,包括终端用户和 CDN 等中间代理服务器
- private:只能被终端用户缓存。
- must-revalidate: 当强缓存未能命中是,强制协商缓存成功后才可以使用缓存(有可能协商缓存请求失败等网络请求失败,会使用缓存)
- expires Cache-Control可同时使用,但Cache-Control优先级更高
协商缓存
强缓存未命中 则会通过协商缓存,向服务器发送(带If-Modify-Since If-None-Match)请求判断L是否命中,304为未修改 继续使用缓存,200则需重新向服务器请求
If-Modify-Since(Last-Modify)
在第一次请求是,返回头有Last-Modify,代表资源最后的修改时间,当再次请求时If-Modify-Since会携带这个值,让服务器判断是否过期
If-None-Match(ETag)
因为Last-Modify只是资源修改时间,有可能内容并未发生变化(增加注释等),因此新增一个ETag,它是根据文件内容生成的一个hash值,保证资源唯一性
ETag比Last——Modify优先验证
启发式缓存
如果没有Cache-control,expires,即没有缓存时,但要是有Last-Modified字段,可以启动启发式缓存,即为Date 响应头的时间减去 Last-Modified 的时间
ctrl+F5 强制刷新页面时,强缓存和协商缓存都会失效,但仅是F5刷新仍可进行协商缓存但不能强缓存
Websocket
websocket
https的一个弊端就是只能有客户端发出请求,服务器响应,服务器无法主动给客户端发送请求
过往要实现这种双向连接的方式是用轮询,就是,客户端每隔一段时间,就发一个询问,了解服务器有没有新的信息,需不需要向客户端发送请求。
为了解决这个问题,而在2008年诞生了websocket协议,客户端和服务器双向链接,服务器也可以发送信息给客户端
特点:
建立在tcp之上
握手阶段采用http协议
数据格式比较轻量,性能开销小,通信高效。
可发送文本,也可以发送二进制数据
没有同源策略,客户端可以与任意服务器通信
协议标识符是ws(如果加密是wss)
握手阶段:
|
GET和POST的区别
- get的请求参数暴露在URL上,而POST放在Request body
- get的数据长度一般限制是2k,每个浏览器的搜索框的长度有限,POST无限制
- get产生一个tcp数据包,而post产生两个,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
- GET请求会被浏览器缓存,POST不会
- get请求在浏览器回退时不发生影响,但是post会再次提交请求
- GET只接受ASCII字符的参数的数据类型,而POST没有限制,支持更多的编码类型(因此get请求中的中文会被浏览器自动转换为ASCll码)
常见端口号
21/tcp FTP 文件传输协议
22/tcp SSH 安全登录、文件传送(SCP)和端口重定向
23/tcp Telnet 不安全的文本传送
80/tcp HTTP 超文本传送协议 (WWW)
443/tcp HTTPS used for securely transferring web pages
25/SMTP
53/DNS udp
110/POP3
8080/tomcat
6379/redis
1433/sqlserver
1521/oracle
常见状态码
2XX 成功
- 200 OK,表示从客户端发来的请求在服务器端被正确处理
- 204 No content,表示请求成功,但响应报文不含实体的主体部分
- 205 Reset Content,表示请求成功,但响应报文不含实体的主体部分,但是与 204 响应不同在于要求请求方重置内容
- 206 Partial Content,进行范围请求
3XX 重定向
- 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
- 302 found,临时性重定向,表示资源临时被分配了新的 URL
- 303 see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源
- 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
- 307 temporary redirect,临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
4XX 客户端错误
- 400 bad request,请求报文存在语法错误
- 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
- 403 forbidden,表示对请求资源的访问被服务器拒绝
- 404 not found,表示在服务器上没有找到请求的资源
5XX 服务器错误
- 500 internal sever error,表示服务器端在执行请求时发生了错误
- 501 Not Implemented,表示服务器不支持当前请求所需要的某个功能
- 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
网络优化
HTTP请求方式
HTTP 内容类型 content-type
常见的媒体格式类型如下:
- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
以application开头的媒体格式类型:
- application/xhtml+xml :XHTML格式
- application/xml: XML数据格式
- application/atom+xml :Atom XML聚合格式
- application/json: JSON数据格式
- application/pdf:pdf格式
- application/msword : Word文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded :
另外一种常见的媒体格式是上传文件之时使用的:
- multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
DNS域名解析
首先会向本地缓存查看是否有对应的ip地址,如果没有,则会向根服务器去向下查询,查询顶级域服务器的地址,二级域等等,直到查询到对应的ip地址,发出http请求,并缓存该个ip地址
DOS DDOS
DOS 攻击的效果是使得计算机或网络无法提供正常的服务。单机对单机
DOS攻击的原理:首先攻击者向被攻击的服务器发送大量的虚假ip请求,被攻击者在收到请求后返回确认信息,等待攻击者进行确认,(此处需要拥有HTTP协议工作方式和tcp三次握手的基本知识)该过程需要TCP的三次握手,由于攻击者发送的请求信息是虚假的,所以服务器接收不到返回的确认信息,在一段时间内服务器会处与等待状态,而分配给这次请求的资源却被有被释放。当被攻击者等待一定的时间后,会因连接超时而断开,这时攻击者在次发送新的虚假信息请求,这样最终服务器资源被耗尽,直到瘫痪。
DDOS DDOS是在DOS的基础上进行的大规模,多个僵尸主机对单机
防御:
1)带宽资源要充足
带宽直接决定了抗DDOS攻击的能力,至少要选择100M带宽的,越多越好。
2)服务器的硬件配置
在带宽以及流量有充分保障的前提下,服务器的硬件配置必须得跟上。当然,主要的因素还是CPU和内存
3)规范自身操作设置
对于DOS和DDOS攻击的防范,主要的防御能力还是取决于服务器以及机房本身。但是,对于咱们用户来说,也需要做到安全操作才行。例如,不要上传陌生、特殊后缀名的文件到服务器上、不要点击来历不明的链接、不安装来路不明的软件,从而杜绝因自身操作问题而导致服务器被攻击。同时,最好是定期对网站的文件进行安全扫描,这样对新出现的漏洞、病毒文件也能及时的发现并清理。
4)机房防火墙的配置
一般来说,在骨干节点配置防火墙的话,能有效抵御DOS和DDOS攻击。因为防火墙在发现受到攻击时,可以将攻击导向一些“无用”的服务器,这样可以保护运行中的服务器不被攻击。
5)搭建CDN 分散攻击力
6)若是使用云服务器,当受到大流量攻击,会被服务商清退,因此当需要被清退时,就需要进行将数据从云服务器上迁移到本地。了解安全防护的报警机制,阿里云、华为云、腾讯云等高级安全防护。
ip4和ip6
- ip4是32位,ip6是128位
- ip6的报头去除了ip4中一些不常用的域,放入了可选项和包头扩展