Nodejs 网络 & HTTP

Favori,

Base

图:Kashish Arora

TCP/IP网络协议

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议

IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网际层协议。

是⼀一个协议家族, 以TCP、IP协议为核⼼心, 包含HTTP、SMTP、TELNET等各种协议。

OSI七层模型

OSI(开放系统互联(Open System Interconnection))一般指开放式系统互联

开放式系统互联是把网络通信的工作分为7层,分别是物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。

第七层: 应用层 为操作系统或者网络应用程序提供访问网络服务的接口。 (html)

第六层: 表示层 压缩,格式转换

第五层: 会话层 负责数据传输中维持网络设备之间的通信链接

第四层: 传输层 把传输表头加到数据上形成数据包,完成端到端的数据传输。协议:TCP UDP

第三层: 网络层 负责对子网间的数据包进行寻址和路由选择,可以实现拥塞控制、网际互联等功能。协议:IP; (路由器)

第二层: 数据链路层 物理地址寻址 (交换机/猫)

第一层: 物理层 在局域网上进行数据传输,负责电脑通信设备与网络媒体之间的互通 (网线网卡……)

数据包

数据包是⽹网络层及以上分层中包的单位

每个分层都会对发送的数据添加一个首部, 首部包含了该层协议相关的信息, 而真正要发送的内容称之为数据.

也就是说每一个数据包都由首部 + 数据组成.

而对于下层来说, 上层发送过来的全部内容, 都会当做本层的数据, 举个例子:

传输层 TCP包:TCP包首部 + 数据 网络层 IP包:IP包首部 + (TCP包首部 + 数据) 数据链路层 以太网包:以太网包首部 + (IP包首部 + (TCP包首部 + 数据))

每层在接收到数据后除了添加首部, 还要做什么呢?

用户1

  • 传输层:TCP模块为保证数据的可靠传输, 需要添加TCP首部
  • 网络层:IP包生成后,参考路由控制表决定接受此 IP 包的路由或主机。
  • 数据链路层:生成的以太网数据包将通过物理层传输给接收端

用户2

  • 数据链路层:主机收到以太网包后,首先从以太网包首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。 如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,比如IP.
  • 网络层:从包首部中判断此 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,比如TCP
  • 传输层:在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照顺序接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。

总结一下几个地址:

  • 数据链路层的是MAC地址, 用来识别同一链路中的不同计算机
  • 网络层的是IP地址, 用来识别TCP/IP 网络中互连的主机和路由器
  • 传输层的是端口号(程序地址), 用来识别同一台计算机中进行通信的不同应用程序

通过以下这几个数据综合来识别一次通信:

  • IP首部:源IP地址
  • IP首部:目标IP地址
  • 协议号, TCP或者UDP
  • TCP首部:源端口号
  • TCP首部:目标端口号

TCP/UDP的区别

用户数据报协议(UDP,User Datagram Protocol)

  • UDP是无连接的,TCP必须三次握手建立连接
  • UDP是面向报文,没有拥塞控制,所以速度快,适合多媒体通信要求,比如及时聊天,支持一对一,一队多。多对一,多对多。
  • TCP只能是一对一的可靠性传输

那么咱们的直播底层是什么协议呢?

其实现在常见的rtmp和hls直播, 都是基于TCP的, 希望能提供稳定的直播环境.

TCP通过什么方式提供可靠性?

  • 超时重发,发出报文段要是没有收到及时的确认,会重发。
  • 数据包的校验,也就是校验首部数据和。
  • 对失序的数据重新排序
  • 进行流量控制,防止缓冲区溢出
  • 快重传和快恢复
  • TCP会将数据截断为合理的长度

TCP如何控制拥塞?

拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。

发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。

为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下:

当cwnd<ssthresh时,使用慢开始算法。也就是乘法算法

当cwnd>ssthresh时,改用拥塞避免算法。也就是加法算法

当cwnd=ssthresh时,慢开始与拥塞避免算法任意。

当出现拥塞的时候就把心的门限值设为此时窗口大小的一般,窗口大小设置为1,再重新执行上面的步骤。 当收到连续三个重传的时候这就需要快重传和快恢复了,当收到连续三个重传 这个时候发送方就要重传自己的信息,然后门限减半但是这个时候并不是网络阻塞,窗口只会减半执行拥塞避免算法。

TCP协议的一次数据传输, 从建立连接到断开连接都有哪些流程?

第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

第二次握手:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认, 设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息, 将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中, 一并发送给客户端,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1, 向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态, 完成TCP三次握手。

完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。通信结束客户端和服务端就断开连接,需要经过四次分手确认。

第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段; 此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1; 主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;

第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;

第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;

主机2收到主机1的ACK报文段以后,就关闭连接; 此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

IP地址

IP 地址(IPv4 地址)由32位正整数来表示,在计算机内部以二进制方式被处理。日常生活中,我们将32位的 IP 地址以每8位为一组,分成4组,每组以 “.” 隔开,再将每组数转换成十进制数

IP地址包含网络标识和主机标识, 比如152.112.110.16

152.112.110就是网络标识, 同一网段内网络标识必须相同 16就是主机标识, 同一网段内主机标识不能重复

IPv6

IPv6(IP version 6)是为了根本解决 IPv4 地址耗尽的问题而被标准化的网际协议。IPv4 的地址长度为 4 个 8 位字节,即 32 比特。而 IPv6 的地址长度则是原来的 4 倍,即 128 比特,一般写成 8 个 16 位字节。

DNS

我们平时访问一个网站, 一个应用程序, 并不是用ip来访问的, 而是用一个域名. 那么域名是怎么和ip地址建立联系的呢?

就是通过dns, Domain Name System. 比如wiki上的一个例子

以访问 zh.wikipedia.org 为例:

客户端发送查询报文”query zh.wikipedia.org”至DNS服务器,DNS服务器首先检查自身缓存,如果存在记录则直接返回结果。 如果记录老化或不存在,则: DNS服务器向根域名服务器发送查询报文”query zh.wikipedia.org”,根域名服务器返回顶级域 .org 的顶级域名服务器地址。 DNS服务器向 .org 域的顶级域名服务器发送查询报文”query zh.wikipedia.org”,得到二级域 .wikipedia.org 的权威域名服务器地址。 DNS服务器向 .wikipedia.org 域的权威域名服务器发送查询报文”query zh.wikipedia.org”,得到主机 zh 的A记录,存入自身缓存并返回给客户端。