综上所述,TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层。
再给大家贴一下每一层的封装格式:
网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。
电脑与电脑之间通常都是通话网卡、交换机、路由器等网络设备连接到一起,那由于网络设备的异构性,国际标准化组织定义了一个七层的 OSI 网络模型,但是这个模型由于比较复杂,实际应用中并没有采用,而是采用了更为简化的 TCP/IP 模型,Linux 网络协议栈就是按照了该模型来实现的。
TCP/IP 模型主要分为应用层、传输层、网络层、网络接口层四层,每一层负责的职责都不同,这也是 Linux 网络协议栈主要构成部分。
当应用程序通过 Socket 接口发送数据包,数据包会被网络协议栈从上到下进行逐层处理后,才会被送到网卡队列中,随后由网卡将网络包发送出去。
而在接收网络包时,同样也要先经过网络协议栈从下到上的逐层处理,最后才会被送到应用程序。
这次主要从 3 个方面介绍了优化 HTTP/1.1 协议的思路。
第一个思路是,通过缓存技术来避免发送 HTTP 请求。客户端收到第一个请求的响应后,可以将其缓存在本地磁盘,下次请求的时候,如果缓存没过期,就直接读取本地缓存的响应数据。如果缓存过期,客户端发送请求的时候带上响应数据的摘要,服务器比对后发现资源没有变化,就发出不带包体的 304 响应,告诉客户端缓存的响应仍然有效。
第二个思路是,减少 HTTP 请求的次数,有以下的方法:
- 将原本由客户端处理的重定向请求,交给代理服务器处理,这样可以减少重定向请求的次数;
- 将多个小资源合并成一个大资源再传输,能够减少 HTTP 请求次数以及 头部的重复传输,再来减少 TCP 连接数量,进而省去 TCP 握手和慢启动的网络消耗;
- 按需访问资源,只访问当前用户看得到/用得到的资源,当客户往下滑动,再访问接下来的资源,以此达到延迟请求,也就减少了同一时间的 HTTP 请求次数。
第三思路是,通过压缩响应资源,降低传输资源的大小,从而提高传输效率,所以应当选择更优秀的压缩算法。
不管怎么优化 HTTP/1.1 协议都是有限的,不然也不会出现 HTTP/2 和 HTTP/3 协议,后续我们再来介绍 HTTP/2 和 HTTP/3 协议
RSA 和 ECDHE 握手过程的区别:
- RSA 密钥协商算法「不支持」前向保密,ECDHE 密钥协商算法「支持」前向保密;
- 使用了 RSA 密钥协商算法,TLS 完成四次握手后,才能进行应用数据传输,而对于 ECDHE 算法,客户端可以不用等服务端的最后一次 TLS 握手,就可以提前发出加密的 HTTP 数据,节省了一个消息的往返时间;
- 使用 ECDHE, 在 TLS 第 2 次握手中,会出现服务器端发出的「Server Key Exchange」消息,而 RSA 握手过程没有该消息;
对于硬件优化的方向,因为 HTTPS 是属于计算密集型,应该选择计算力更强的 CPU,而且最好选择支持 AES-NI 特性的 CPU,这个特性可以在硬件级别优化 AES 对称加密算法,加快应用数据的加解密。
对于软件优化的方向,如果可以,把软件升级成较新的版本,比如将 Linux 内核 2.X 升级成 4.X,将 openssl 1.0.1 升级到 1.1.1,因为新版本的软件不仅会提供新的特性,而且还会修复老版本的问题。
对于协议优化的方向:
- 密钥交换算法应该选择 ECDHE 算法,而不用 RSA 算法,因为 ECDHE 算法具备前向安全性,而且客户端可以在第三次握手之后,就发送加密应用数据,节省了 1 RTT。
- 将 TSL1.2 升级 TSL1.3,因为 TSL1.3 的握手过程只需要 1 RTT,而且安全性更强。
对于证书优化的方向:
- 服务器应该选用 ECDSA 证书,而非 RSA 证书,因为在相同安全级别下,ECC 的密钥长度比 RSA 短很多,这样可以提高证书传输的效率;
- 服务器应该开启 OCSP Stapling 功能,由服务器预先获得 OCSP 的响应,并把响应结果缓存起来,这样 TLS 握手的时候就不用再访问 CA 服务器,减少了网络通信的开销,提高了证书验证的效率;
对于重连 HTTPS 时,我们可以使用一些技术让客户端和服务端使用上一次 HTTPS 连接使用的会话密钥,直接恢复会话,而不用再重新走完整的 TLS 握手过程。
常见的会话重用技术有 Session ID 和 Session Ticket,用了会话重用技术,当再次重连 HTTPS 时,只需要 1 RTT 就可以恢复会话。对于 TLS1.3 使用 Pre-shared Key 会话重用技术,只需要 0 RTT 就可以恢复会话。
这些会话重用技术虽然好用,但是存在一定的安全风险,它们不仅不具备前向安全,而且有重放攻击的风险,所以应当对会话密钥设定一个合理的过期时间。
HTTP/2 协议其实还有很多内容,比如流控制、流状态、依赖关系等等。
这次主要介绍了关于 HTTP/2 是如何提示性能的几个方向,它相比 HTTP/1 大大提高了传输效率、吞吐能力。
第一点,对于常见的 HTTP 头部通过静态表和 Huffman 编码的方式,将体积压缩了近一半,而且针对后续的请求头部,还可以建立动态表,将体积压缩近 90%,大大提高了编码效率,同时节约了带宽资源。
不过,动态表并非可以无限增大, 因为动态表是会占用内存的,动态表越大,内存也越大,容易影响服务器总体的并发能力,因此服务器需要限制 HTTP/2 连接时长或者请求次数。
第二点,HTTP/2 实现了 Stream 并发,多个 Stream 只需复用 1 个 TCP 连接,节约了 TCP 和 TLS 握手时间,以及减少了 TCP 慢启动阶段对流量的影响。不同的 Stream ID 才可以并发,即时乱序发送帧也没问题,但是同一个 Stream 里的帧必须严格有序。
另外,可以根据资源的渲染顺序来设置 Stream 的优先级,从而提高用户体验。
第三点,服务器支持主动推送资源,大大提升了消息的传输性能,服务器推送资源时,会先发送 PUSH_PROMISE 帧,告诉客户端接下来在哪个 Stream 发送资源,然后用偶数号 Stream 发送资源给客户端。
HTTP/2 通过 Stream 的并发能力,解决了 HTTP/1 队头阻塞的问题,看似很完美了,但是 HTTP/2 还是存在“队头阻塞”的问题,只不过问题不是在 HTTP 这一层面,而是在 TCP 这一层。
HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给 HTTP 应用,那么当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。
有没有什么解决方案呢?既然是 TCP 协议自身的问题,那干脆放弃 TCP 协议,转而使用 UDP 协议作为传输层协议,这个大胆的决定, HTTP/3 协议做了!
HTTP/2 虽然具有多个流并发传输的能力,但是传输层是 TCP 协议,于是存在以下缺陷:
- 队头阻塞,HTTP/2 多个请求跑在一个 TCP 连接中,如果序列号较低的 TCP 段在网络传输中丢失了,即使序列号较高的 TCP 段已经被接收了,应用层也无法从内核中读取到这部分数据,从 HTTP 视角看,就是多个请求被阻塞了;
- TCP 和 TLS 握手时延,TCL 三次握手和 TLS 四次握手,共有 3-RTT 的时延;
- 连接迁移需要重新连接,移动设备从 4G 网络环境切换到 WIFI 时,由于 TCP 是基于四元组来确认一条 TCP 连接的,那么网络环境变化后,就会导致 IP 地址或端口变化,于是 TCP 只能断开连接,然后再重新建立连接,切换网络环境的成本高;
HTTP/3 就将传输层从 TCP 替换成了 UDP,并在 UDP 协议上开发了 QUIC 协议,来保证数据的可靠传输。
QUIC 协议的特点:
- 无队头阻塞,QUIC 连接上的多个 Stream 之间并没有依赖,都是独立的,也不会有底层协议限制,某个流发生丢包了,只会影响该流,其他流不受影响;
- 建立连接速度快,因为 QUIC 内部包含 TLS1.3,因此仅需 1 个 RTT 就可以「同时」完成建立连接与 TLS 密钥协商,甚至在第二次连接的时候,应用数据包可以和 QUIC 握手信息(连接信息 + TLS 信息)一起发送,达到 0-RTT 的效果。
- 连接迁移,QUIC 协议没有用四元组的方式来“绑定”连接,而是通过「连接 ID 」来标记通信的两个端点,客户端和服务器可以各自选择一组 ID 来标记自己,因此即使移动设备的网络变化后,导致 IP 地址变化了,只要仍保有上下文信息(比如连接 ID、TLS 密钥等),就可以“无缝”地复用原连接,消除重连的成本;
另外 HTTP/3 的 QPACK 通过两个特殊的单向流来同步双方的动态表,解决了 HTTP/2 的 HPACK 队头阻塞问题。
小结
TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号**。序列号能够保证数据包不重复、不丢弃和按序传输。
不使用「两次握手」和「四次握手」的原因:
- 「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
- 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
1、开启了一个设置 然后因为网络原因收到的数据包时间戳不是递增的就丢弃了
2、accept满了,半连接或者全连接
根据你客户端syn报文中的源端口有关,如果源端口是不一致的话,则重新建立连接,如一致的话,看源码也是会断开相应连接
如何关闭一个TCP连接伪造RST报文 这样就可以让它们释放连接了
在 FIN_WAIT_2 状态时,如果收到乱序的 FIN 报文,那么就被会加入到「乱序队列」,并不会进入到 TIME_WAIT 状态。
等再次收到前面被网络延迟的数据包时,会判断乱序队列有没有数据,然后会检测乱序队列中是否有可用的数据,如果能在乱序队列中找到与当前报文的序列号保持的顺序的报文,就会看该报文是否有 FIN 标志,如果发现有 FIN 标志,这时才会进入 TIME_WAIT 状态。
在 TCP 正常挥手过程中,处于 TIME_WAIT 状态的连接,收到相同四元组的 SYN 后会发生什么?
如果双方开启了时间戳机制:
- 如果客户端的 SYN 的「序列号」比服务端「期望下一个收到的序列号」要大,并且SYN 的「时间戳」比服务端「最后收到的报文的时间戳」要大。那么就会重用该四元组连接,跳过 2MSL 而转变为 SYN_RECV 状态,接着就能进行建立连接过程。
- 如果客户端的 SYN 的「序列号」比服务端「期望下一个收到的序列号」要小,或者SYN 的「时间戳」比服务端「最后收到的报文的时间戳」要小。那么就会再回复一个第四次挥手的 ACK 报文,客户端收到后,发现并不是自己期望收到确认号,就回 RST 报文给服务端。
在 TIME_WAIT 状态,收到 RST 会断开连接吗?
- 如果
net.ipv4.tcp_rfc1337参数为 0,则提前结束 TIME_WAIT 状态,释放连接。 - 如果
net.ipv4.tcp_rfc1337参数为 1,则会丢掉该 RST 报文。
在没有有开启去keep-alive且无数据传输的情况下
断电的话服务端的TCP连接将会一直处于已建立连接状态
进程崩溃的话 会发送fin进行挥手 是可以感知到的
有数据传输情况下的问题
客户端主机宕机又迅速重启-只要有一方重启完成后收到之前的TCP连接的报文都会回复RST报文,以断开连接
客户端主机宕机,一直没有重启,会重传,先到达最大重传次数或者最大超时时间其中一个条件后,就会停止重传
客户端拔掉网线后,并不会直接影响 TCP 连接状态。所以,拔掉网线后,TCP 连接是否还会存在,关键要看拔掉网线之后,有没有进行数据传输。
有数据传输的情况:
- 在客户端拔掉网线后,如果服务端发送了数据报文,那么在服务端重传次数没有达到最大值之前,客户端就插回了网线,那么双方原本的 TCP 连接还是能正常存在,就好像什么事情都没有发生。
- 在客户端拔掉网线后,如果服务端发送了数据报文,在客户端插回网线之前,服务端重传次数达到了最大值时,服务端就会断开 TCP 连接。等到客户端插回网线后,向服务端发送了数据,因为服务端已经断开了与客户端相同四元组的 TCP 连接,所以就会回 RST 报文,客户端收到后就会断开 TCP 连接。至此, 双方的 TCP 连接都断开了。
没有数据传输的情况:
- 如果双方都没有开启 TCP keepalive 机制,那么在客户端拔掉网线后,如果客户端一直不插回网线,那么客户端和服务端的 TCP 连接状态将会一直保持存在。
- 如果双方都开启了 TCP keepalive 机制,那么在客户端拔掉网线后,如果客户端一直不插回网线,TCP keepalive 机制会探测到对方的 TCP 连接没有存活,于是就会断开 TCP 连接。而如果在 TCP 探测期间,客户端插回了网线,那么双方原本的 TCP 连接还是能正常存在。
除了客户端拔掉网线的场景,还有客户端「宕机和进程崩解」的两种场景。
第一个场景,客户端宕机这件事跟拔掉网线是一样无法被服务端的感知的,所以如果在没有数据传输,并且没有开启 TCP keepalive 机制时,,服务端的 TCP 连接将会一直处于 ESTABLISHED 连接状态,直到服务端重启进程。
所以,我们可以得知一个点。在没有使用 TCP 保活机制,且双方不传输数据的情况下,一方的 TCP 连接处在 ESTABLISHED 状态时,并不代表另一方的 TCP 连接还一定是正常的。
第二个场景,客户端的进程崩解后,客户端的内核就会向服务端发送 FIN 报文,与服务端进行四次挥手。
所以,即使没有开启 TCP keepalive,且双方也没有数据交互的情况下,如果其中一方的进程发生了崩溃,这个过程操作系统是可以感知的到的,于是就会发送 FIN 报文给对方,然后与对方进行 TCP 四次挥手。
tcp_tw_reuse 的作用是让客户端快速复用处于 TIME_WAIT 状态的端口,相当于跳过了 TIME_WAIT 状态,这可能会出现这样的两个问题:
- 历史 RST 报文可能会终止后面相同四元组的连接,因为 PAWS(防止序列号回绕) 检查到即使 RST 是过期的,也不会丢弃。
- 如果第四次挥手的 ACK 报文丢失了,有可能被动关闭连接的一方不能被正常的关闭;
虽然 TIME_WAIT 状态持续的时间是有一点长,显得很不友好,但是它被设计来就是用来避免发生乱七八糟的事情。
「HTTPS 是先进行 TCP 三次握手,再进行 TLSv1.2 四次握手」,这句话一点问题都没有,怀疑这句话是错的人,才有问题。
「HTTPS 中的 TLS 握手过程可以同时进行三次握手」,这个场景是可能存在到,但是在没有说任何前提条件,而说这句话就等于耍流氓。需要下面这两个条件同时满足才可以:
- 客户端和服务端都开启了 TCP Fast Open 功能,且 TLS 版本是 1.3;
- 客户端和服务端已经完成过一次通信;
HTTP 的 Keep-Alive 也叫 HTTP 长连接,该功能是由「应用程序」实现的,可以使得用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,减少了 HTTP 短连接带来的多次 TCP 连接建立和释放的开销。
TCP 的 Keepalive 也叫 TCP 保活机制,该功能是由「内核」实现的,当客户端和服务端长达一定时间没有进行数据交互时,内核为了确保该连接是否还有效,就会发送探测报文,来检测对方是否还在线,然后来决定是否要关闭该连接。
-
TCP/IP网络模型属于网络通信的一套通用的网络协议
-
应用层是工作在操作系统的用户态,传输层及以下则工作在内核态
-
MSS(TCP最大报文段长度)
-
传输层的报文会携带端口号的,因此接收方可以识别出该报文是发送给哪个应用
-
网络层最常使用的是 IP 协议(Internet Protocol),IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文。
-
IP地址主要分成两种意义,一个是网络号,一个是主机号,根据掩码可以获取两者
-
IP 协议的寻址作用是告诉我们去往下一个目的地==该朝哪个方向走==,路由则是==根据「下一个目的地」选择路径==。寻址更像在导航,路由更像在操作方向盘。
自己用通俗的话讲一遍就是这个ip告诉我们最终要去哪个网络的哪台主机,路由的话就是咋去,遇到个路由器给他看,他帮你分配 -
网络接口层会将网络层的数据封装成帧,根据mac头部进行转发
-
⭐其实我们访问对应的网址后面一系列的东西,其实最后都是请求他实际的域名的 比如
https://www.baidu.com/s?wd=杭州电子科技大学&rsv_spt=1&rsv_iqid=0xc992c3e7004b9c01&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8类似于这一段其实就是请求百度,后面是数据源的数据名,用来生成相应的请求报文发送给服务器域名进行请求 -
必须用到DNS因为委托操作系统发送消息的时候,必须提供通信对象的IP地址(浏览器中会有域名的缓存,每次都会先看是否有缓存,再去请求DNS)
-
MTU:一个网络包的最大长度,以太网中一般为1500字节。MSS:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度。 -
TCP报文的源端口随机生成,目的端口根据你的请求,如果是HTTP请求那就是80 如果是其他就是其他规定的端口
-
TCP可靠传输 可以看看他的报文头部
-
搞清楚 包发给谁 查一下路由表,根据路由表获得的ip然后使用arp协议找到对应路由器的mac地址,操作系统也会有arp缓存 不是每次都要广播获取
-
在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。
-
HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。
-
GET 的语义是请求获取指定的资源。GET 方法是安全、幂等、可被缓存的。
POST 的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 不安全,不幂等,(大部分实现)不可缓存。 (但不完全是这样 可以用get实现新增和删除那就不是安全和幂等了,用post实现查询,那就是安全和幂等)
-
GET请求其实也是可以带上body的同时POST请求的URL中也可以有参数
-
HTTP(1.1)优缺点一体的双刃剑,分别是「无状态、明文传输」,同时还有一大缺点「不安全」。
-
HTTP(1.1)性能 1、长连接 2、管道网络传输 3、响应队头阻塞
-
SSL/TLS 协议基本流程:
- 客户端向服务器索要并验证服务器的公钥。
- 双方协商生产「会话秘钥」。
- 双方采用「会话秘钥」进行加密通信。
-
HTTP/1.1 相比 HTTP/1.0 性能上的改进:
- 使用 TCP 长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
- 支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。
-
HTTP/1.1 还是有性能瓶颈:
- 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩
Body的部分; - 发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
- 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;
- 没有请求优先级控制;
- 请求只能从客户端开始,服务器只能被动响应。
- 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩
-
HTTP/2 相比 HTTP/1.1 性能上的改进:1、头部压缩 2、二进制格式 (原来传200 用三个字符转成二进制 24位 现在200直接一个8位的就解决掉了)3、数据流 4、多路复用 5、服务器推送
-
HTTP/2缺陷 还是存在队头阻塞问题 HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给 HTTP 应用,那么当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。
-
HTTP/3 优化:使用了QUIC+UDP QUIC可以实现类似TCP的可靠传输 有以下特点1、无队头阻塞 2、更快的连接建立 3、连接迁移
-
HTTPS常用的密钥交换算法有两种,分别是RSA和ECDHE算法
-
rsa整个加密过程已经过的很舒服了,比起第一次看,这次看真的懂了很多(rsa没有前向安全性 参考下面)
-
【前向安全性】:前向安全性或前向保密性(英语:Forward Secrecy,缩写:FS),有时也被称为完美前向安全(英语:Perfect Forward Secrecy,缩写:PFS),是密码学中通讯协议的安全属性,指的是长期使用的主密钥泄漏不会导致过去的会话密钥泄漏。
-
HTTPS的优化 硬件优化 软件优化 会话复用 协议优化 证书优化
-
两次握手,无法避免历史连接 三次握手同步双方初始序列号
-
如果单纯知识ip进行分片的话,是没有效率的,所以要有tcp分片
-
第一次握手丢失 客户端触发超时重传 第二次握手丢失 服务端、客户端触发超时重传 第三次握手丢失 服务端超时重传
-
三次握手成功后才是真正的应用 才是进行socket连接 就是accept
-
第一次挥手丢失了 客户端会进行重传,超过重传的次数还没得到应答的后,会直接进行close状态
-
不管有没有收到第二次挥手,客户端到后面都会处于fin_wait2状态
-
内核是没有权利替代进程关闭连接,所以必须由进程主动调用close函数来触发服务端发送Fin
-
MSL报文最大生存时间,MSL要大于TTL(IP数据包可以经过的最大路由数)消耗为0的时间,以确保报文已被自然消亡
-
主动发起连接的一方,才会有TIME-WAIT状态,需要这状态的两个原因,1、防止历史连接中的数据被后面相同四元组的错误接收 2、保证被动连接的一方能被正确关闭
-
socket tcp 客户端connect成功返回在第二次握手 服务端accept成功返回在第三次握手
-
RTT是数据发送时刻到接收到确认的时刻的差值(经常动态变化的值) RTO是超时重传时间 应该是略大于RTT不能太长也不能太短(也会是经常动态变化)
-
快速重传机制,它不以时间为驱动,而是以数据驱动重传 其中还有两个其他实现重传的机制 SACK D-SACK
-
接收窗口和发送窗口大小并不是完全相等的,因为传输过程是存在时延的,所以接收窗口和发送窗口是约等于关系
-
糊涂窗口综合症 一点小数据也发 甚至还比不上TCP+的头要解决糊涂窗口综合症,就解决上面两个问题就可以了
- 让接收方不通告小窗口给发送方(解决方法:当窗口小于min(MSS,缓存空间/2)就像发送方通告窗口大小为0)
- 让发送方避免发送小数据(解决方法:Nagle算法 满足以下两个条件之一才可以发送数据:要等到窗口大小 >= MSS 或是数据大小>= MSS/////或者收到之前发送数据的ack回包)
-
流量控制只是端到端的 拥塞控制很明显是应对整个网络中的环境
-
swnd = min(cwnd, rwnd) 发送窗口为拥塞窗口和接收窗口的小值,
我之前想的有点偏差,之前看那个拥塞窗口一直变大,觉得会传很多,原来是拥塞和发送窗口的小值,这下明白了所以说还是要多想想 -
拥塞窗口每收到一个ack+1,当超过慢启动门限后每超过一个窗口确认加1/cwnd,所以慢启动门限后所有的拥塞窗口都收到了 才+1
-
TCP解决粘包有三种方式:固定长度的消息;特殊字符作为边界(如果消息内部出现这个特殊字符的时候 需要对这个字符进行转义);自定义消息结构
-
只有主动关闭的才有time_wait状态
-
MSL是由网络层的IP包中的TTL来保证的,TTL是IP头部的一个字段,用于设置一个数据报可经过的路由器数量上限
-
设置time_wait的两大原因一定是要清楚
-
TCP第三次握手是可以携带数据的
-
TCP三次握手之后才能进行TLS1.2四次握手
-
开启了TCP Fast Open之后 接收到客户端的请求,同时验证了cookie后响应ack 可立刻传输数据
-
HTTP的Keep-Alive是长连接 TCP的Keep-Alive是TCP保活机制
-
传输层是针对进程间的传输 网络层是针对主机间的传输
-
数据链路层其实就是在没有直连之间的网络间中各个设备间的传输
-
IP地址中有两个IP是特殊的,分别是主机号全为1和全为0地址 全为1就是广播地址 全为0就是指定对应的网络
-
有直接广播和本地广播 要知道是什么意思
-
ip分类其实就是能很快的判断分类 很快的找出网络地址和主机地址
-
对某类地址可以再进行子网划分
-
公有ip地址和私有ip地址 我们用的基本都是私有ip
-
DNS 有查询缓存的过程
-
ARP协议也是有查询缓存的过程,同时,但是换船是一定期限的,超过期限会删除 ARP会动态执行
-
DHCP动态获取IP地址 动态的请求服务器 获取相应的地址 也类似于有四次握手 用UDP广播通信 因为有路由器转发请求 所以不在一个网络内也没事 交互完成后 客户端能在租用期内使用服务器分配的ip地址
-
NAT网络地址转换
网络地址与端口转换 NAPT两个不同的私有ip可以转换为一个公有ip以不同的端口号进行区分 会生成相应的路由转换表
-
ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议。 从哪里丢失 就从哪里发回去 分为两类
一类用于诊断的查询消息 也就是查询报文类型
另一类通知出错原因的错误消息 也就是差错报文类型 -
IGMP是因特网组管理协议,工作在主机(组播成员)和最后一跳路由之间
-
ping 用的是ICMP查询报文
traceroute 用的是ICMP差错报文







