计算机网络知识点总结

概念引入

网络层相关

传输层相关

应用层相关

网络安全相关

网络协议

  1. 理解什么是协议,了解TCP/IP网络协议族的构成,每层协议在应用程序中发挥的作用
  2. 三次握手和四次挥手详细原理,为什么要使用这种机制
  3. 有哪些协议是可靠,TCP有哪些手段保证可靠交付
  4. DNS的作用、DNS解析的详细过程,DNS优化原理
  5. CDN的作用和原理
  6. HTTP请求报文和响应报文的具体组成,能理解常见请求头的含义,有几种请求方式,区别是什么
  7. HTTP所有状态码的具体含义,看到异常状态码能快速定位问题
  8. HTTP1.1、HTTP2.0带来的改变
  9. HTTPS的加密原理,如何开启HTTPS,如何劫持HTTPS请求
  10. 理解WebSocket协议的底层原理、与HTTP的区别

简述OSI七层模型

OSI七层网络模型,自底向上描述 (最好说明每个层干什么,举例网络协议,都在哪个层)

OSI七层模型、四层模型

  • 物理层:建立、维护、断开物理连接
  • 数据链路层: 将二进制流 组合成 ; *帧编码*和误差纠正控制
  • 网络层: 提供主机间的逻辑通信;路由选择、路由及逻辑寻址;负责根据网络地址传送数据包;协议:IP, ARP, RARP, ICMP
  • 传输层: 提供应用进程间的逻辑通信。负责将数据*可靠地*传送到相应的*端口*。协议:TCP,UDP
  • 表示层:数据的表示、安全、压缩。
  • 会话层:建立、管理、中止会话。
  • 应用层: 为操作系统或网络应用程序提供访问网络服务的接口。协议:FTP,HTTP,DNS

OAuth2.0

OAuth授权所需信息:

  1. 应用名称
  2. 应用网站
  3. 重定向URI或回调URL(redirect_uri)
  4. 客户端标识 client_id
  5. 客户端密钥 client_secret

授权成功后,服务器 回调请求redirect_uri,客户端通过下发的code和自己的secret请求服务器得到access_token

B站课程

CSRF攻击

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

攻击者盗用了你的身份,以你的名义发送恶意请求

CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。

防御手段

  • 提交的时候,加入验证码
  • 验证Referer;(服务端做Referer检查;也不是万无一失的,发请求时我们可以篡改Referer的值)
  • csrftoken验证
    • 在 HTTP 请求中以參数的形式添加一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,假设请求中没有token 或者 token 内容不对,则觉得可能是 CSRF 攻击而拒绝该请求。
  • 敏感的操作应该使用POST;(攻击者也可以构造form提交,仅仅使用POST远远不够)

Node.js增加csrftoken

XSS攻击

跨站脚本攻击

XSS 的全称是 Cross Site Scripting 也就是跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了

防御:对输入(和URL参数)进行过滤,对输出进行编码,Cookie设置成http-only

node.js防御

UDP特点

  • 无连接的
  • 尽最大努力交付,不可靠,不进行拥塞控制
  • 面向报文的,没有拥塞控制,适合多媒体通信的要求
  • 支持一对一,一对多,多对一,多对多通信
  • 首部开销小,只有8个字节

UDP协议首部

应用层,传输层udp首部

udp首部

检验和:伪首部 + 首部(源端口,目标端口,长度,检验和) + 数据 -> 二进制反码运算求和后,将得出的结果求反码

TCP特点

传输控制协议

  • 面向连接的传输层协议
  • 只能是点对点的
  • 提供可靠交付;拥塞控制
  • 提供全双工通信
  • 面向字节流

TCP如何实现可靠传输

TCP通过序列号、检验和、确认应答信号、重发控制、连接管理、窗口控制、流量控制、拥塞控制实现可靠性。

  1. 应用数据被分割成 TCP 认为最适合发送的数据块。
  2. 序列号;TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
  3. 校验和;TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  4. TCP 的接收端会丢弃重复的数据。
  5. 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
  6. 拥塞控制:当网络拥塞时,减少数据的发送。
  7. 停止等待协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就- 停止发送,等待对方确认。在收到确认后再发下一个分组。 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

停止等待协议

  • 无差错情况
  • 超时重传(等待一个RTT,如果没有收到ACK再次发送)
  • 确认丢失
  • 确认迟到

只要接收方没有确认收到,就进行重发;这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat Request)

ARQ协议的缺点是 信道利用率太低

流水线传输(就是 连续ARQ协议) 提高 信道利用率

信道利用率的定义

信道利用率公式

信道利用率公式

流水线传输

流水线传输

连续ARQ协议

发送窗口 利用滑动窗口 确认已发送数据

TCP如何实现流量控制

TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)

TCP报文段首部

TCP报文段首部

传输层的功能

提供进程间的逻辑通信;为相互通信的应用进程提供逻辑通信

端口 到 端口;

三类端口:

  • 熟知端口 0-1023
  • 登记端口 1024-49151
  • 客户端端口 49152-65535

应用层的功能

传输层和应用层之间的关系

应用层 = 传输层 + 端口

常见应用层协议

  • http = tcp + 80
  • https=tcp+443
  • RDP = tcp + 3389 # 远程桌面
  • ftp = tcp + 21
  • 共享文件夹 = tcp+445
  • SMTP = tcp + 25 # 发邮件
  • pop3 = tcp + 110 # 收邮件
  • telnet = tcp + 23
  • dns = tcp + 53

服务与应用层协议之间的关系

  • 服务 使用TCP或UDP的端口侦听客户端请求
  • 客户端使用IP地址定位服务器,使用目标端口定位服务
  • 可以在服务器上设置开放必要的端口实现网络安全

服务对应端口号:

  • web -> tcp 80
  • ftp -> tcp 21
  • smtp -> tcp 25
  • pop3 -> tcp 110

TCP和UDP的区别

TCP: 将传输的文件分段传输时需要建立会话可靠传输流量控制

应用场景:下载一部电影

UDP: 一个数据包就能完成数据通信,不分段,不建立会话,不需要流量控制,不可靠传输

应用场景:DNS域名解析,QQ聊天,讲课时屏幕广播(多播,广播)

物理层

建立、维护、断开物理连接

  • 物理接口信号线的规格;包括:形状和尺寸、引线数目和排列、固定和锁定装置等;
  • 传输二进制位流的标准;包括:传输二进制位流时线路上信号电压高低、阻抗匹配情况、传输速率和距离的限制等。

传输数据单位:比特流,二进制流 也就是所谓电流

数据链路层

将二进制流 组合成

数据链路层主要有两个功能 :*帧编码*和*误差纠正控制*。

数据链路层的主要协议有:

  • 帧中继(Frame Relay);
  • 点对点协议(Point-to-Point Protocol);
  • 以太网(Ethernet);
  • 高级数据链路协议(High-Level Data Link Protocol);
  • 异步传输模式(Asynchronous Transfer Mode);

网络层

功能:路由选择、路由及逻辑寻址

网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。

协议:

  • IP(IPV4 IPV6)通过IP地址进行路由选择
  • ARP“AddressResolutionProtocol”(地址解析协议) 将IP地址转换为MAC地址
  • RARP 逆地址解析
  • ICMP 因特网报文

    由于IP协议的两个缺陷:没有差错控制和查询机制,因此产生了ICMP。ICMP主要是为了提高IP数据报成功交付的机会,在IP数据报传输的过程中进行差错报告和查询,比如目的主机或网络不可到达,报文被丢弃,路由阻塞,查询目的网络是否可以到达等等。

传输层

网络层负责根据网络地址传送数据包

传输层负责将数据*可靠地*传送到相应的*端口*。

传输层的服务一般要经历传输连接建立阶段,数据传送阶段,传输连接释放阶段3个阶段才算完成一个完整的服务过程

在这一层,信息传送的协议数据单元称为*数据段*或*报文*。

传输层提供了主机应用程序进程之间的端到端的服务,基本功能如下:

  • 分割与重组数据 (网络层发送的数据包可能是黏在一起的)
  • 端口号寻址 (我要知道发送给主机的哪个端口)
  • 连接管理 (建立tcp或udp连接)
  • 差错控制和流量控制、纠错 (保证传输质量;拥塞控制)

传输层要向会话层提供通信服务的可靠性,避免报文的出错、丢失、延迟时间紊乱、重复、乱序等差错。

传输层既是OSI层模型中负责数据通信的最高层,并向高层用户屏蔽通信子网的细节。

协议:

  • 传输控制协议TCP(Transmission Control Protocol)
  • 用户数据报协议UDP(User Datagram Protocol)

TCP在不可靠的IP网络层上提供了一个可靠的传输层

会话层

建立、管理、终止会话。(在五层模型里面已经合并到了应用层)

对应主机进程,指本地主机与远程主机正在进行的会话

运输服务质量参数(QOS)等会话的属性在这一层设置(MQTT协议中 0:最多一次,1:最少1次,2:只一次)

表示层

数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)

格式有,JPEG、ASCll、DECOIC、加密格式等

应用层

网络服务与最终用户的一个接口。

应用层为操作系统或网络应用程序提供访问网络服务的接口。

应用层协议的代表包括:Telnet、FTP、HTTP、DNS(Domain Name System:域名系统)等。

简化后四层模型:物理层,网络层,传输层,应用层

描述从在浏览器地址栏输入URL到浏览器加载,中间发生了什么

  • 用户输入域名
  • DNS解析返回IP地址
    • 浏览器缓存 -> host -> 路由缓存 -> 本地DNS -> 根域名、顶级、二级、三级…
    • 先查本地缓存,本地缓存没有,依次请求根域名、顶级、二级、三级…DNS服务器,直到找到IP地址
    • 本地域名服务器缓存DNS信息,留着下次用
  • 浏览器拿到IP后,就向服务器发送http连接请求,tcp三次握手
  • 防火墙将外网IP转换到内网IP,此步骤是通过NAT地址转换
  • 请求到达LVS服务
  • LVS反向代理到业务服务器,服务器返回数据,流量从防火墙出去
  • 浏览器接收到请求,进行处理,
    • 解析请求是2XX,正常显示;3XX,进行转发,4XX或5XX,显示错误
  • 断开连接, TCP四次挥手

网络层的作用,都有哪些协议

网络层:实现终端节点间的通信

  • IP协议:路由寻址
  • ARP:获取MAC地址
  • RARP协议:从mac地址获取IP 地址
  • ICMP协议:数据发送异常通知

IP分类

四个级别,分别为A类、B类、C类和D类。分类的依据是IP地址的前四位:

  • A类IP地址是第一位为“0”的地址。A类IP地址的前8位是网络标识,用十进制标识的话0.0.0.0-127.0.0.0是A类IP地址的理论范围。另外我们还可以得知,A类IP地址最多只有128个(实际上是126个,下文不赘述),每个网段内主机上限为2的24次方,也就是16,777,214个。

  • B类IP地址是前两位为“10“的地址。B类IP地址的前16位是网络标识,用十进制标识的话128.0.0.0-191.255.0.0是B类IP地址的范围。B类IP地址的主机标记长度为16位,因此一个网段内可容纳主机地址上限为65534个。

  • C类IP地址是前三位为“110”的地址。C类IP地址的前24位是网络标识,用十进制标识的话192.0.0.0-223.255.255.0是C类IP地址的范围。C类地址的后8位是主机标识,共容纳254个主机地址。

  • D类IP地址是前四位为“1110”的地址。D类IP地址的网络标识长32位,没有主机标识,因此常用于多播。

http1.0,1.1,2.0的区别

ssl加密过程

也就是https加密过程

引申出双向非对称加密实现动态token的方案

socket的连接过程

分两个部分

服务器端:

1.创建socket,绑定端口 2.开始监听(listen) 3.等待并接受客户端连接请求,返回新的socket(accept) 4.由新socket与客户端进行io交互。 5.关闭连接(可能主动,也可能被动)

客户端:

  1. 创建socket(绑定本机随机端口,这个系统自行完成)
  2. 连接服务器(connect) 与服务器进行io交互
  3. 关闭连接(可能主动,也可能被动) 以上是基于tcp协议的过程,udp更简单。

简述DNS

DNS(Domain Name System): 域名系统

是*域名解析服务器*组成的服务系统

工作原理

  • 客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
  • 当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
  • 若没有查到,则将请求发给根域 DNS 服务器,并依序从根域查找顶级域, 由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字, 即向客户机所在网络的DNS服务器发出应答信息,DNS 服务器收到应答后先在缓存中存储, 然后,将解析结果发给客户机。若没有找到,则返回错误信息。
  • 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。

DNS缓存

我们有时会遇到一种情况:ip可以访问,域名地址访问失败,这是怎么回事呢?

原因:域名解析失败,往往是因为DNS缓存的问题。

DNS存在着多级缓存,从离浏览器的距离排序的话,有以下几种:

浏览器缓存,系统缓存,路由器缓存,ISP(电信运营商)缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。

多级DNS服务器,每一级DNS服务器如何去缓存,缓存刷新时长?

浏览器缓存

chrome://net-internals/#dns 这里可以看各域名的DNS 缓存时间。Chrome对每个域名会默认缓存60s。

ISP(电信运营商)缓存

有些不靠谱,有些缓存服务器(不多)会忽略网站DNS提供的TTL,自己设置一个较长的TTL, 导致顶级DNS更新时不能及时拿到新的IP地址

缓存是双刃剑,提高了获取DNS的速度,也会影响DNS在IP变更时不能及时更新到最新。

HTTP状态码

基本响应代码:

  • 200(“OK”)
    • 一切正常。实体主体中的文档(若存在的话)是某资源的表示
  • 400(“Bad Request”)
    • 客户端方面的问题。实体主题中的文档(若存在的话)是一个错误消息。希望客户端能够理解此错误消息,并改正问题。
  • 500(“Internal Server Error”)
    • 服务期方面的问题。实体主体中的文档(如果存在的话)是一个错误消息。该错误消息通常无济于事,因为客户端无法修复服务器方面的问题。
  • 301(“Moved Permanently”)
    • 当客户端触发的动作引起了资源URI的变化时发送此响应代码。另外,当客户端向一个资源的旧URI发送请求时,也发送此响应代码。
  • 404(“Not Found”) 和410(“Gone”)
    • 当客户端所请求的URI不对应于任何资源时,发送此响应代码。404用于服务器端不知道客户端要请求哪个资源的情况;410用于服务器端知道客户端所请求的资源曾经存在,但现在已经不存在了的情况。
  • 409(“Conflict”)
    • 当客户端试图执行一个”会导致一个或多个资源处于不一致状态“的操作时,发送此响应代码。

SOAP Web服务只使用响应代码200(“OK”)和500(“Internal Server Error”)。无论是你发给SOAP服务器的数据有问题,还是服务器在处理数据的过程中出现问题,或者SOAP服务器出现内部问题,SOAP服务器均发送500(“Internal Server Error”)。

状态码系列:

  • 1XX:通知
  • 2XX: 成功
  • 3XX 重定向
  • 4XX:客户端错误
  • 5XX 服务端错误

如何维持长链接

维持tcp长链接就是客户端每隔一定时间向服务端发送心跳包,表明连接还活着。

TCP通过哪些方式来保证可靠性

  • 拆包;将应用数据分割成TCP认为最合适发送的数据块
  • 确认机制,发送报文后,等待确认
  • 重发机制,没有收到确认,将重发数据段
  • 保持它首部和数据的校验和,确认数据的准确性
  • 排序,丢弃重复的
  • 流量控制

三次握手和四次挥手

三次握手 是TCP链接建立过程中的三次握手

  • 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
  • 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
  • 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

四次挥手 是客户端与服务器断开连接过程中的四次挥手

1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。 2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。 3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。 4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。 5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。 6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

为什么要三次握手

为了确保双发收发都是正常的

简述tcp连接时的握手过程,不要第三次握手行不行?为什么不能用两次握手进行连接?

没有第三次握手,无法确认第二次握手是否成功,即服务端不知道客户端是否成功拿到了自己发送的SYN。

为什么要四次挥手

双方数据发送完毕,都认为可以断开

当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。 只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

客户端断连怎么处理

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

简述http协议

http协议是在tcp/ip协议之上的应用层规范

http请求分为4部分:状态行,请求头,空行,消息体

<method> <request-URL> <version>
<headers>

<entity-body>

常用的四种方法:GET,POST,PUT,DELETE用来 查,增,改,删四种操作

GET 是安全的和幂等的

GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Connection: Keep-Alive

POST 用于改变服务器上的资源

POST / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive

sex=man&name=Professional  

GET 和 POST的区别

  • GET和POST是HTTP定义的两种不同方法,本质上都是TCP链接,并无差别
  • 有一个重大差别是,GET产生一个TCP数据包;POST产生两个TCP数据包。

    对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

  • 但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

    GET用来获取资源,POST用来上传资源 GET参数通过URL传递,POST放在Request body中 GET只能有ASCII码的编码方式提交请求,POST的数据编码格式没有规定 GET可提交的数据量受URL长度限制(浏览器规定url长度<2k,服务器一般只处理64k以下的数据),POST一般不受限制 GET请求会被浏览器主动cache,而POST不会,除非手动设置。 GET在浏览器回退时是无害的,而POST会再次提交请求。

ssl加密的过程

非对称加密过程:

  • A:B,你好,我想向你发一段消息,请你把你的公钥给我
  • B:好的,我的公钥是:xxxxxxx。
  • A:好的,我收到了你的公钥,我给你发送的消息经过你的公钥加密后是:yyyyyyy。
  • B:收到,我现在用我的密钥来解密看看。

由于非对称加密算法复杂度和计算量大,对称加密效率高,SSL就将这两种加密算法混合着用,这样安全和效率就都能保证了。其中具体的过程如下:

SSL加密过程:

  1. 客户端A给出 支持的SSL版本+一个随机数+自己支持的加密方式
  2. 服务端B接收到这些信息后确认加密方式+自己的安全证书+一个随机数发给A
  3. 客户端A确认数字证书有效性(验证方法上面已经说明),然后生成一个随机数,并将这个随机数用B的数字证书公钥加密后发送给B。
  4. 服务端B使用自己的私钥解密这个随机数
  5. A和B通过第二步确定的加密方法将前三个随机数生成一个对话密钥 用来接下来的通信(个人感觉不需要三个随机数,只用最后一个就够了,这样做可能是为了更安全)

拥塞避免

tcp/ip拥塞控制 TCP拥塞控制算法(TCP congestion control algorithm)

主要包括3个主要部分:

  1. 慢启动;
  2. 拥塞避免;
  3. 快重传和快恢复

拥塞控制

  • 慢启动门限 ssthresh
  • 接收窗口 rwnd (receive window)
  • 发送窗口 swnd(send window)
  • 拥塞窗口 cwnd(congestion window)

出现拥塞时,网络吞吐量会随输入负荷的增大而下降,因此要进行拥塞控制。

TCP拥塞控制算法(TCP congestion control algorithm)

主要包括3个主要部分:

  1. 慢启动;
  2. 拥塞避免;
  3. 快重传和快恢复

慢启动(slow-start)算法原理

开始发送一个报文段,收到确认后拥塞窗口翻倍。然后传输2个报文段,收到2个确认后增加拥塞窗口变成了4个MSS。 这样没经过一个RTT,发送速率就会翻番。于是,TCP发送的起始速率慢,但是在慢启动阶段会以指数增长。

拥塞避免

进入拥塞状态后,TCP的cwnd增加速率就比较缓慢,一个RTT将cwnd的值增加一个MSS,线性增长。

快速恢复

在快速恢复中,对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK,cwnd的值都增加一个MSS。 最终,当对丢失报文段的一个ACK到达时,TCP在降低cwnd后进入拥塞避免状态。

当TCP通信开始后, 网络吞吐量会逐渐上升; 随着网络发生拥堵, 吞吐量会立刻下降;

拥塞控制, 归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案.

tcp/ip超时重传

TCP 提供可靠数据传输服务,为保证传输正确性,TCP 重传其认为已经丢失的包。

TCP 有两套重传机制,一是基于定时器(超时),二是基于确认信息的构成(快速重传)。

tcp/ip滑动窗口

为了实现TCP的可靠传输,实现流量控制

滑动窗口解决的是流量控制的的问题,就是如果接收端和发送端对数据包的处理速度不同,如何让双方达成一致。 TCP会话的双方都各自维护一个发送窗口和一个接收窗口

窗口的概念

发送方的发送缓存内的数据都可以被分为4类:

  1. 已发送,已收到ACK
  2. 已发送,未收到ACK
  3. 未发送,但允许发送
  4. 未发送,但不允许发送

其中类型2和3都属于发送窗口。

接收方的缓存数据分为3类:

  1. 已接收
  2. 未接收但准备接收
  3. 未接收而且不准备接收

其中类型2属于接收窗口。

TCP的可靠传输是基于以字节为单位的滑动窗口

滑动窗口:已发送并收到接收的,发送窗口(已发送未收到确认的,未发送的),不允许发送的

滑动窗口确认机制

如何描述发送窗口的状态

tcp/ip流量控制

接收端处理数据的速度是有限的,如果发送方的速度太快,就会把缓冲区打满。这个时候如果继续发送数据,就会导致丢包等一系列连锁反应。

所以TCP支持根据接收端能力来决定发送端的发送速度。这个机制叫做流量控制。

通过滑动窗口机制,实现流量控制

发送方通过发送窗口发送数据,接收方通过接受窗口接收数据。接收方告知发送方自己可以接收的数据大小。

tcp/udp

TCP/UDP 的区别:

协议	连接性	双工性	可靠性	有序性	有界性	拥塞控制	传输速度	量级	头部大小

TCP,面向连接(Connection oriented),全双工(1:1),可靠(重传机制),有序(通过SYN排序),无边界,有粘包情况,有拥塞控制,传输速度慢,量级低,头部20~60字节
UDP,无连接(Connection less),n:m,不可靠(丢包后数据丢失),无序,有消息边界, 无粘包,无拥塞控制,传输速度快,量级高,头部8字节

UDP socket 支持 n 对 m 的连接状态

TCP与UDP不同的是:传输数据的质量

TCP对于发送数据进行跟踪,这种数据管理需要协议有以下两大关键功能:

  • 可靠性:保证数据确实到达目的地。如果未到达,能够发现并重传。

    TCP通过确认SYN-ACK机制来保证数据传输的可靠性。

  • 数据流速控制:管理数据的发送速率,以使接收设备不致于过载。

    TCP通过滑动窗口确认机制来管理数据的发送速率

NAT网络地址转换

NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”

解决公网地址不足的问题

把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。

NAT名字很准确,网络地址转换,就是替换IP报文头部的地址信息

网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关

跨域cors

跨域是针对浏览器来说的,浏览器的同源策略(地址里面的协议、域名和端口号均相同)

关于浏览器跨域的原理,一个请求在浏览器端发送出去后,是会收到返回值响应的, 只不过浏览器在解析这个请求的响应之后,发现不属于浏览器的同源策略(地址里面的协议、域名和端口号均相同), 会进行拦截。如果是在curl里面发送一个请求,都是没有跨域这样一个概念的

基于http协议层面的几种解决办法

  • 设置Access-Control-Allow-Origin
  • jsonp
  • CORS预请求

设置Access-Control-Allow-Origin

  • 设置为*表示,可以接收任意域名的访问;

    http.createServer((request, response) => {
    response.writeHead(200, {
        'Access-Control-Allow-Origin': '*'
    })
    }).listen(port);
    
  • 也可以设置为特定域名访问

    http.createServer((request, response) => {
    response.writeHead(200, {
        'Access-Control-Allow-Origin': 'http://127.0.0.1:3010/'
    })
    }).listen(port);
    
  • 如果有多个域名访问可以在服务端动态设置

    http.createServer((request, response) => {
    const origin = request.headers.origin;
    
    if ([
        'http://127.0.0.1:3010'
    ].indexOf(origin) !== -1) {
        response.writeHead(200, {
            'Access-Control-Allow-Origin': origin,
        })
    }
    }).listen(port);
    

jsonp

浏览器是允许像link、img、script标签在路径上加载一些内容进行请求,是允许跨域的, 那么jsonp的实现原理就是在script标签里面加载了一个链接,去访问服务器的某个请求,返回内容。

<html>
    <head>
        <meta charset="utf-8" />
        <title>cors</title>
    </head>
    <body>
        <script src="http://127.0.0.1:3011/xxx"></script>
    </body>
</html>

CORS预请求

预请求也是浏览器的一种安全机制,会先发送一个****给目的站点,与跨域服务器协商可以设置的头部信息,允许的方法和headers信息等。

缓存头Cache-Control的含义和使用

可缓存性: public, private, no-cache

public http经过的任何地方都可以进行缓存 private 只有发起请求的这个浏览器才可以进行缓存,如果设置了代理缓存,那么代理缓存是不会生效的 no-cache 任何一个节点都不可以缓存

到期: max-age= , s-maxage= , max-stale=

max-age= 设置缓存到多少秒过期 s-maxage= 会代替max-age,只有在代理服务器(nginx代理服务器)才会生效 max-stale= 是发起请求方主动带起的一个头,是代表即便缓存过期,但是在max-stale这个时间内还可以使用过期的缓存,而不需要愿服务器请求新的内容

重新验证

must-revalidate 如果max-age设置的内容过期,必须要向服务器请求重新获取数据验证内容是否过期 proxy-revalidate 主要用在缓存服务器,指定缓存服务器在过期后重新从原服务器获取,不能从本地获取

其它

no-store 本地和代理服务器都不可以存储这个缓存,永远都要从服务器拿body新的内容使用 no-transform 主要用于proxy服务器,告诉代理服务器不要随意改动返回的内容

通过Set-Cookie设置,下次请求会自动带上,键值对形式可以设置多个

cookie属性

  • max-age或expires设置过期时间
  • Secure只在https发送
  • httpOnly无法通过document.cookie访问

http/https长连接短连接

http/https头压缩

http/https服务端推送

http/https二进制传输

http/https各个请求类型

http/https幂等

http/https网络攻击

https的加密过程

https是http + ssl或tls

SSL全名为Secure Sockets Layer; TLS(Transport Layer Security); 传输层安全协议。

对称加密(共享密钥加密), 加密和解密同用一个密钥。加密时就必须将密钥传送给对方。

非对称密钥加密: 使用一对非对称的密钥。一把叫做私有密钥,一把叫做公开密钥。 私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。

HTTPS: 在交换密钥阶段使用非对称密钥加密方式,之后建立通信交换报文阶段则使用对称加密加密方式。

HTTPS的加密解密方式是非对称加密与对称加密的结合 数字签名,是为了保证数据完整性的一种手段。

http2协议

http2目前只能在https下面才可以

优势:

  • 信道复用
  • 分帧传输
  • Server Push http/1.1协议里是客户端主动请求,服务才会响应

多个域名