上一篇讲了非科班前端须要掌握的、基本的计算机组成原理。 这篇开撸计算机网络
。前端
本文主要目的也是为了非科班前端补充计算机科班基础知识
,好比你要作node开发,不熟悉数据如何在网络中传输的话,理解不少API
会比较疑惑,那接下来,来看看这篇为你精心准备的文章吧😁!node
这些内容其实比较枯燥,但我采起图文并茂
的形式,而且对于不重要的知识会标注,尽可能减小阅读的枯燥感
。啥也不说了,喝口水,开撸!webpack
具体实战题目精品文章:juejin.cn/post/692867…web
计算机网络:是一个将分散的、具备独立功能的计算机系统
,经过通讯设备
与线路
链接起来,由功能完善的软件
实现资源共享和信息传递的系统。面试
这里须要注意的是,按分布范围,计算机网络里有局域网LAN
和广域网WAN
, 其中局域网的表明以太网,以及这两种网络最重要的区分点,局域网
基于广播技术
,广域网
基于分组交换
技术。(这些概念听一下就行,后面会详细介绍,由于理解广播和分组交换技术,大致上就理解了局域网和广域网)算法
这些内容主要是为了学习后面具体的协议,以及分析这些协议的报文时,须要掌握的基本概念。windows
速率就是数据传输(数据是指0和1)的速率,好比你用迅雷下载,1兆每秒,来衡量目前数据传输的快慢。它是计算机网络中最重要的一个性能指标。浏览器
在计算机网络中,网络带宽是指在单位时间(通常指的是1秒钟)内能传输的数据量,好比说你家的电信网络是100兆比特,意思是,一秒内最大的传输速率是100兆比特。缓存
吞吐量表示在单位时间内经过某个网络(或信道、接口)的数据量。安全
以上三点,咱们举个案例
时延是指数据(报文/分组/比特流)从网络(或链路)的一端传送到另外一端所需的时间。单位是s。 时延分一下几种:
(1)发送时延
就是说我跟你说话,从我开始说,到说话结束这段时间,就是发送时延
。
(2)传播时延
如gif图所示,信道上第一个比特开始,到最后一个比特达到主机接口须要的时间就是传播时延
。
(3)排队时延
分组在通过网络传输时,要通过不少的路由器
。
但分组在进入路由器后要先在输入队列中排队等待
处理。
在路由器肯定了转发接口后,还要在输出队列中排队等待转发,这就产生了排队时延
。
排队时延的长短每每却决于网络当时的通讯量,当网络的通讯量很大时会发生排队溢出,是分组丢失
。
(4)处理时延
路由器
或主机
在收到数据包时,要花费必定时间进行处理,例如分析数据包的首部
、进行首部差错检验
,查找路由表
为数据包选定准发接口,这就产生了处理时延
。
(5)往返时间(RTT)
在计算机网络中,往返时间也是一个重要的性能指标,它表示从发送方发送数据开始,到发送方收到来自接收方的确认(接受方收到数据后便当即发送确认)总共经历的时间
(6)时延带宽积
是指传播时延乘以带宽
OSI
参考模型是网络互连的七层
框架, 这里不详细介绍了,每一层的具体内容会在后面介绍,这里只须要有一个初步的印象。
以下图所示,1,2,3层主要是是物理链路
组成的,好比光纤
,路由器
,集线器
,主要负责的是数据通讯
。5,6,7层是软件控制的
,好比http
协议,是一种软件层面控制的协议,主要负责处理传输来的数据
。
对于物理层,有人会说,这不就是网线吗,好比家里链接路由器的网线,电线杆上的光纤?其实否则,物理层更多的是规定一种标准
,他并无论物理介质具体是什么,好比电线杆上是光纤仍是双绞线,只要你能按物理层规定的标准传输数据就行。
那物理层到底有哪些主要任务呢?
电气特性
,信号的电平用+10V - +15V
表示二进制的0
,用-10V - -15V
表示二进制的1
,只要条网线能表示这个特性,就无论你用什么材料了。知道物理层是规定传输媒体接口的标准
便可。网卡
传输出来的数据是电信号
,光纤
传输的是光脉冲
信号,有光脉冲表示1
,无光脉冲表示0
。10的8次方MHz
,所以光纤通讯系统的带宽远远大于其它各类传输媒体的带宽电信号
转为光信号
,而后光信号
快到服务器的时候,再把光信号
转为电信号
。为何须要中继器呢?
由于再线路上传输的信号功率会逐渐衰减
,衰减到必定程度时将形成信号失真
,所以会致使接收错误。
中继器能够对信号进行再生
和还原
,增长信号的传输距离。
须要注意的是,中继器两端链接不一样的网段
,而不是子网。什么叫不一样的网段呢,须要在网络层学习IP分类
以后才可以理解这个概念,这里简单的理解为,不一样的网段就是不一样路由器链接的网络
。
你能看完上面这么多概念也真是不容易,喝口水,咋们继续!
接下来咱们进入下一层,数据链路层!
咱们用一个小故事来举例
小秘书
下达任务,让小秘把5份文件给B公司,小秘呢,就找送快递物理层
去作这个事(1) 封装成帧
数据链路层并非无脑转发boss的信息,她要把文件编号封装一下。封装的网络数据包,在链路层就叫数据帧
。
(2)透明传输
透明传输是指无论boss下达的任何信息,好比文件里有裁掉这个秘书的信息,秘书都要原本来本的传输。帧的数据部分可能有跟帧首部彻底同样
的字符,这时候就要采起必定的措施,让接受方不要被被误导,能让接收方知道哪些是帧的首部哪些是帧的数据。这个问题有没有相似js的转义字符的问题,好比字符串<div>究竟是指div标签呢,仍是div字符串呢?
(3)差错控制
差错控制是在文件送到B公司小秘书手里的时候,快递包上写着5个文件,秘书一看只有3个文件,就会让傻子从新发送有没有送到的文件。差错控制的方法有CRC循环冗余码
,这个就不细讲了,我本身也不甚了解,只知道链路层的帧,会有一个FCS位留给这个码,用来判断一个帧是否出错。
(4)差错纠正
差错纠正是链路层知道1,2,3,4,5个文件,丢失的两个文件究竟是哪两个,而且能经过从新发送没有的文件来纠正。
还有一些是故事里没有提到的数据链路层的功能,好比:
(5)流量控制
好比说发送方发送速度特别快,接收方接收速度特别慢
,会形成传输出错。
这里须要注意的是,传输层TCP
也有流量控制
功能,区别在于TCP
是端到端
的流量控制,链路层是点到点
(好比一个路由器到下一个路由器)
流量控制的方法有滑动窗口协议
,以及选择重传协议
,这两个留在讲TCP的时候讲。接下来说一下以太网,以太网是目前最多见的局域网技术。对于咱们理解局域网比较有帮助。
以太网是一种局域网
技术,其规定了访问控制方法
、传输控制协议
、网络拓扑结构
、传输速率
等,完成数据链路层和物理层的一些内容,它采用一种称做CSMA/CD
的媒体接入方法(后面会介绍),另外的一些局域网技术,好比无线局域网
等。
目的地址
和源地址
指的是MAC地址
,即设备的物理地址。MAC地址用于标示网卡,每一个网卡都具备惟一的MAC 地址以太网帧
发出,此时局域网中全部主机都可收到这个桢,主机中的网卡接收到以太网桢后,会将目的MAC地址和本身的MAC地址进行比较,若是不相同就会丢弃,若是相同则会接收
,此时则B主机就收到了A的消息。差错控制
,即检验帧的正确性
单播地址
、广播地址
、多播地址
,其中单播地址如上面A给B主机发送,其接收者为一个,而且其目的地址的最高字节的低位为0
跟以太网相关的拓扑结构有星型
和总线型
。
星型拓扑以下:
总线型拓扑以下:
互联网初期,以太网的总线型拓扑
比较广泛。随着总线型以太网上的站点数目增多,可靠性也会随之降低
,而随着大规模集成电路以及专门芯片的发展,使得星型以太网变得便宜又可靠
。
须要注意的是,以太网虽然物理上是星型拓扑
,但逻辑上是总线型
。
计算机传出的数据,通过网卡,就会变为以太网的帧
,还会完成一些链路管理
(CDMA/CD的实现),以及编码和译码
(编码译码我不太理解。。。好像是曼彻斯特编码,规定如何表示高低电平)。
无线局域网WLAN是利用无线电波
、激光
和红外线
等无线通讯技术来构建的局域网。
无线局域网咱们只介绍一下典型的网络结构。
AP
就是通讯基站
,若是基站覆盖的移动设备能够直接经过基站来通讯基站和基站之间传输数据
,来达到两个在不一样基站覆盖范围内的无线设备通讯。由于这个协议是以太网所使用
的,因此咱们只须要记住一些特色就好了。
总线型
,半双工网络
(半双工是指容许数据在两个方向上传输,可是,在某一时刻,只容许数据在一个方向上传输)(1)网桥
网桥根据MAC帧
的目的地址进行转发和过滤。当网桥收到一个帧时,并不会向全部接口转发此帧,而是先检查此帧的目的MAC地址
,而后再肯定将该帧转发到哪个口,或者是把它丢弃。
这里须要注意的是,网桥链接的是不一样的网段,网段是什么呢,我这里简单介绍一下,具体要到讲IP地址
的时候细说,同一网段指的是IP地址
和子网掩码
(讲ip地址的时候会细讲)相与获得相同的网络地址。
(2)以太网交换机
谈到交换机,就不得不提两个概念,冲突域
和广播域
只能由一台设备
发送信息的范围。全部能接收到这个信号
的设备范围称为广播域跨网段
,而冲突域只是发生的同一个网段
。举个例子,公司里你们的电脑通常都是链接到交换机
上,由于交换机能够隔离冲突域
,冲突域
的最大问题在于,同一时间只能有一台机器传输数据,公司那么多人,若是这样的话,传输数据速度太慢了。而后交换机再链接到路由器
上,首先路由器
能隔离广播域,其次不通过路由器,你的数据链路层上的包
没办法进入到互联网里面去`,路由器是网络层的设备。
兄弟,能看完上面内容,你也真够能忍的,牛B,喝口水!继续!
概念走一走,看一看,瞄一眼就行啦!
网络层主要任务是将分组
(分组的概念是大多数计算机网络都不能连续地传送任意长的数据,因此实际上网络系统把数据分割成小块,而后逐块地发动,这种小块就称做分组)从一台主机移动到另外一台主机,从而提供了主机到主机的通讯服务和各类形式的进程到进程的通讯
。
当主机H1
要向另外一主机H2
发送数据(报文)时,首先将数据划分红若干个等长的分组
,而后将这些分组一个接一个地发往里与H1相联的路由A
,当A
接到分组后,先放入缓冲区,再按必定的路由算法肯定该分组下一步将发注哪一个结点,如此一个结点一个结点传递,直到最终目的H2
。
这一段话比较啰嗦,简单来讲分组就是分数据块
,同时还具备无需创建链接
,存储转发
(存储转发是指以太网交换机的控制器先将输入端口到来的数据包缓存起来,先检查数据包是否正确,并过滤掉冲突包错误),动态分配路线
(交换设备会根据网络情况选择不一样的路线,好比路由器)的优势。
数据报是经过网络传输的数据的基本单元
,包含一个报头(header)
和数据
自己。说白了,就是带地址的数据,好比你的写了一句微信"你好",这串文字本上加上源地址,目的地址,就是数据报。
20字节
,共20 * 8 = 160比特(1字节=8比特)0 - 4
比特是版本号
,版本有ipv4/ipv6单位是4B
,最小为5, 为何是5呢?由于首部至少20字节,因此4* 5就是20字节首部+数据
TTL
,它告诉网络,数据包在网络中的时间是否太长而应被丢弃。每通过一个路由器减一,变成0就丢弃TCP
协议用6
表示,UDP
协议用17
表示便可。首部校验和占16位
。这个字段只检验数据报的首部,但不包括数据部分。IP地址
,目的地址是经过DNS
查询得来的。为何要分片呢?
链路层数据帧封装的数据大小是有限制
的,以太网的MTU
(MTU是指一种通讯协议的某一层上面所能经过的最大数据包大小)是1500字节
。
接下来咱们就看看在ip数据包上,哪些字段标识了分片的数据呢?
同一数据的分片
时相同。MF
,MF=1
即表示后面“还有分片”的数据报。MF=0
表示这已经是若干数据报片中的最后一个。DF
(Don’t Fragment),意思是“不能分片”。只有当DF=0
时才容许分片。 ip地址有5种
1.0.0.0~126.255.255.255
128.0.0.0~191.255.255.255
192.0.0.0~223.255.255.255
224.0.0.0~239.255.255.255
240.0.0.0~254.255.255.255
127.0.0.0~127.255.255.255
用于环回测试,D类地址用于组播,E类地址用于科研这里须要注意的是,你发没发现,为何咱们前端启动webpack测试环境的时候,通常地址都是192.168.*.*(* 是指0-255的数字); 在公司和家里都是这个网段,不是很奇怪吗,你家里的网段怎么和公司同样呢?
实际上是由于有一部分叫私有IP地址
,是不能拿到网络上跟别的计算机通讯的。只能是局域网
本身内部用。好比说有:
能够看到,C类私有地址就是192.168网段,每一个局域网均可以有这些私有IP。
还有一些特殊地址
,须要了解
注意,这里的全1是指,
ipv4地址由4个字节组成
,每个字节是8位,8位全一就是十进制的255
, 即255.255.255.255
。
255.255.255.255
,在本网络的目的地址写这个的话,就会内网广播
192.169.10.1
,这是c类网络,因此网络号是192.169.10
,主机号是1
,当主机号全0时,就是0,表示192.169.10.0
这个网段192.169.10.1
这个c类地址,主机号都是1,也就是8个1,表明255,因此192.169.10.255
表示本网段的广播地址127
做为网络号,主机号非全0或1,好比说127.0.0.1
表明本机,称为环回地
址。在ip地址分类里面,咱们知道私有ip地址
是不能跟外网交互的,在小公司大多数计算机的地址都是192.168
网段,都是私有ip地址,它是怎么跟外网交互数据的呢,这里就引出来一个知识点叫网络地址转换NAT
。
如上图所示,192.168.0.3
,192.168.0.4
都是私有网段上的,它们没法跟外网通讯,这个时候因为路由器安装了NAT软件,就能够将本身的ip地址,即路由器的ip地址172.38.1.5
做为内网的代理,去访问外网,外网返回来的数据,通过路由转换,转换成内网的192.168
网段的私有地址。
首先要明白,为何要划分子网?
首先你们要知道:
整体来讲,划分子网不但没有增长可用IP地址,并且减小了可用IP地址,由于每一个子网中的全0网络地址和全1广播地址均不能做为主机ip来使用。
为何划分子网:
接下来,咱们看看子网划分
如上图右侧,咱们将145.13.0.0
这个网段划分了三个子网,其中一个是145.13.3.0
,一个是145.13.21.0
,问题来了,若是一个网络包来了,网络包要交给的ip地址是145.13.3.10
,咱们怎么知道给哪一个子网呢?
方法是将目的包的ip地址,跟子网的子网掩码
相与预算(二进制与预算规则是,1跟1得1,其它为0),也就是目的地址145.13.3.10
跟子网145.13.3.0
的子网掩码255.255.255.0
的与预算,获得的结果是145.13.3.0
,因此发送到的子网就是145.13.3.0
。
这里有人会问什么是子网掩码,子网掩码的格式跟IP是同样的,0,0,0,0 到 255.255.255.255,主要是帮助咱们划分子网的,了解到这里对咱们前端就够了。
为何须要ARP协议呢?
咱们简单回顾一下以太网的帧的格式
上图有一个
源地址
和目的地址
,这两个地址都是指的mac地址
,mac地址
是什么呢?简单说来就是两台相邻的路由器A和B,A怎么把数据传给B呢,它总要知道B的物理地址吧,物理地址就像门牌号
同样,我要知道你住在哪里,才能把数据送过去吧?
首先你确定知道本身的mac地址是多少,由于在网卡上有,问题在于,别人的mac地
址是多少?ARP协议
就是来帮你找mac地址
的。
接着咱们说一下
ARP协议
的过程(比较官方的介绍,看不懂能够略过):
每台主机都会在本身的ARP缓冲区中创建一个 ARP列表
,以表示IP地址
和MAC地址
的映射关系
当源主机须要将一个数据包要发送到目的主机时,会首先检查本身 ARP列表
中是否存在该 IP地址
对应的MAC地址
若是有,就直接将数据包发送到这个MAC地址
;若是没有,就向本地网段发起一个ARP请求
的广播包,查询此目的主机对应的MAC地址
此ARP请求
数据包里包括源主机的IP地址
、硬件地址
、以及目的主机的IP地址
。网络中全部的主机收到这个ARP请求
后,会检查数据包中的目的IP是否和本身的IP地址一致
若是不相同就忽略此数据包;若是相同,该主机首先将发送端的MAC地址
和IP地址
添加到本身的ARP列表
中
若是ARP表
中已经存在该IP的信息,则将其覆盖,而后给源主机发送一个 ARP响应
数据包,告诉对方本身是它须要查找的MAC地址
源主机收到这个ARP响应
数据包后,将获得的目的主机的IP地址
和MAC地址
添加到本身的ARP列表
中,并利用此信息开始数据的传输
若是源主机一直没有收到ARP响应
数据包,表示ARP查询失败
DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段lP地址范围,客户机登陆服务器时就能够自动得到服务器分配的lP地址和子网掩码。说白了,当你接入局域网的时候,自动由这个dhcp服务器给你分配ip,windows用户可能知道网卡配置里面,由自动获取ip的功能,若是路由器提供DHCP服务,你就会自动获取随机分配的ip。
路由器里能够开启这个服务。
大体工做过程(了解便可)
ICMP协议是一个网络层协议。 为何咱们须要ICMP协议呢?
一个新搭建好的网络,每每须要先进行一个简单的测试,来验证网络是否畅通;可是IP协议并不提供可靠传输
。若是丢包了,IP协议并不能通知传输层是否丢包以及丢包的缘由。
因此咱们就须要一种协议来完成这样的功能–ICMP协议。
ICMP协议的功能主要有:
咱们举一个例子:
主机H2收到主机H1的一个UDP包
,结果H2发现这个包里的端口没有被监听,这时候就回复给H2一个ICMP应答报文
,意思是这个UDP数据包
,没法交给应用进程,只能丢弃了。
如下是4种常见的ICMP差错报告报文
咱们经常使用的ping
命令借助ICMP协议
,探测主机是否能找到目的主机。
路由器是一种具备多个输入端口和多个输出端口的专用计算机,其任务是转发和分组。
以下图所示,分别由转发和分组功能的说明。
接着,咱们看一下路由器输入端口作了哪些事情
首先,物理层是傻瓜层
,传输比特流
,咱们把物理层的比特流还原成数据链路层的数据帧,而后把数据链路层的数据报脱去,成为网络层数据包,交给路由器。这时候就要判断一下这个数据包是什么类型的了。
若是它是路由器之间,交换路由信息的分组,就会把这个数据包交付给如上上图所示的,路由选择处理机,进行处理和计算。若是是数据分组,就会放到一个队列里面
,排队等候,而后选择一个合适的输出端口输出。
最后咱们看一下路由器输出端口作了哪些事情
从上图能够看到,输出端口是作的输入端口的逆过程,将网络层的数据包转换为链路层的数据帧,最后转为物理层的比特流。
输入和输出端口须要注意的是,它们都有一个缓冲队列,好比输入数据的速度太快,输出数据速度慢,为了平衡输入输出速度,就用缓冲队列把数据缓冲下来,一个一个慢慢的处理,但缓冲队列也有限度,超出这个限度,缓冲队列容纳不下,包就会被丢到。
立刻就要到对前端最重要的传输层和应用层知识了!准备接招!
传输层是只有计算机才有的层次,主要提供是进程间逻辑通讯
+ 可靠传输
或者不可靠
的功能。好比你的QQ跟你异地女朋友的QQ视频聊天,这就是不一样计算机之间,进程间的通讯。
这里简单说一下可靠传输协议TCP
+ 不可靠传输协议UDP
。
TCP面向链接,可靠,不提供广播和多播,并且时间延迟比较大,适用于大文件传输。 UDP无链接,收到的报也不确认,但时间延迟小,适用于小文件。
端口号能够用来标识同一个主机上通讯的不一样应用程序(就是哪一个应用程序在使用这个端口)。
那为何一个端口只能分配给一个应用程序,不能是多个呢?
若是服务器有两个应用程序A,B
,分别启动了A服务和B服务,它们监听同一个端口,那有数据来的时候,服务器没法判断这个数据究竟是给A,仍是给B。
UDP协议是参考模型中一种无链接
的传输层协议,提供面向事务的简单不可靠信息传送服务。
(1) UDP协议的特色
UDP是无链接的
,减小开销和发送数据以前的时间延迟。你们都知道TCP
的三次握手和四次分手
,这个是须要时间花销的,可是UDP没有这部分花销。
UDP使用最大努力交付
,即不保证可靠交付。那谁来保证可靠的交付呢?是由UDP的上一层协议,应用层来保证。
UDP是面向报文的
,适合一次性传输少许数据的网络应用。什么意思呢,以下图,UDP这层,把应用层的所有内容做为本身的数据报部分,在IP层也只是加了一个IP首部,咱们知道,在以太网,链路层上的数据若是超过1500字节,就会分片,因此网络层发现上面传输层给了太大的数据就会分片
,加上UDP是不可靠的协议,这就加大了UDP的不可靠性
,容易丢失,因此UDP适合数据量少的。
减小网络传输开销
的一方面。(2)UDP首部
0 - 65535
。源端口号能够没有,由于不但愿收到对方的回应,能够写全0,目的端口是必定要有的。首部+数据的长度
,好比数据2B,首部固定是8B,那么UDP长度就是2+8 = 10B首部和数据有错误
,若是有错就丢弃掉。好比说目的主机找不到对应的端口号,就会给发送方返回一个ICMP,‘端口不可达’
的差错报文。TCP协议简单来讲是一种位于传输层的,面向链接的、可靠的、基于字节流的传输层通讯协议
TCP协议的特色:
面向链接
的传输层协议。好比说TCP的三次握手,四次分手,针对的都是链接。只能有两个端点
,每一条TCP链接是点对点的。也就是说TCP是不一样计算机之间的进程的通讯
。可靠有序,不丢不重
。全双工通讯
。全双工指的是链接双方能够同时收发数据。在收发两端都有发送缓存和接收缓存,发送缓存就是一个准备发送的队列,接收缓存是一个准备接收的队列。面向字节流
。以下图,咱们解释一下什么是面向字节流: 图中的1,2,3,4.....数据块,每个表示一个字节。tcp将应用层的数据变为了这样的字节进行发送,好比玩过node同窗,知道一个buffer,buffer就是字节流。
TCP报文的首部格式
以下图所示,咱们看一下比较重要的一些首部字段,这里咱们介绍固定的20字节
的TCP首部
接收方收到了1,2,3个字节组成的数据包,而后接收方就会发送一个确认报文给发送方,其中确认报文的确认号就应该是4,由于1,2,3这三个字节的组成的数据包已经收到了。
控制位 | 做用 |
---|---|
ACK | 置1时表示确认号合法,为0的时候表示数据段不包含确认信息,确认号被忽略 |
PSH | 置1时请求的数据段在接收方获得后就可直接送到应用程序,而没必要等到缓冲区满时才传送 |
RST | 置1时重建链接。若是接收到RST位时候,一般发生了某些错 |
SYN | 置1时用来发起一个链接 |
FIN | 置1时表示发端完成发送任务。用来释放链接,代表发送方已经没有数据发送了 |
URG | 紧急指针,告诉接收TCP模块紧要指针域指着紧要数据 |
以下图所示,分别来了解一下创建链接的过程:
SYN置为1
,seq
指的是序号,是随机产生的。分配缓存和变量
,缓存指的是一个字节流队列。(发送方和接收方都有这个队列,并且若是双方须要互相通讯,那么双方都会有发送缓存和接收缓存),接着会返回一个确认报文,其中SYN控制位置为1
,意思是容许创建链接,ACK是确认号
,确认收到了发送方的包,而且会设一个seq序号
,也为一个随机数。小写ack
是确认号,也就是接下来但愿发送方要发的数据从哪开始。SYN控制位变为0
,意思这不是创建链接的请求了,要正式发数据了,ACK是确认码
,意思是收到了服务器的确认请求了。以下图所示,分别来了解一下释放链接的过程:
FIN=1,seq=u
。u是以前传送过来的最后一个字节的序号+1
。FIN:用来释放一个连接,当FIN=1的时候,代表此报文的发送方已经完成了数据的发送,没有新的数据要传送,并要求释放连接。
客户端等着服务器返回确认
服务器收到客户端的请求断开连接的报文以后,返回确认信息。ACK=1,seq=v,ack=u+1
。这个时候,客户端不能给服务器发送信息报文,只能接收。可是服务器要是还有信息要传给服务器,仍然能传送。这里的v
是什么意思呢,这就取决于服务器发送给客户端以前的一个包确认号是多少了。
当服务器也没有了能够传的信息以后,给客户端发送请求结束的报文。FIN=1,ACK=1,ack=u+1,seq=w
。这里的w
,跟上面的v
是一个意思,为何不都是v
呢,由于这一步和上一步中间可能还在发数据呢,因此seq
这个数据发送的字节流序号可能要变。
客户端接收到FIN=1
的报文以后,返回确认报文,ACK=1,seq=u+1,ack=w+1
。发送完毕以后,客户端进入等待状态,等待两个时间周期。关闭。
为何最后还要等待两个时间周期呢?
ACK
报文在传输的时候丢失,服务器并无接收到这个报文。这个候时候服务器就会超时重传这个FIN
消息,而后客户端就会从新返回最后一个ACK报文
,等待两个时间周期,完成关闭。为何链接的时候是三次握手,关闭的时候倒是四次握手?
FIN
报文时,仅仅表示对方再也不发送数据了可是还能接收数据,而本身也未必所有数据都发送给对方了,因此己方能够当即关闭,也能够发送一些数据给对方后,再发送FIN
报文给对方来表示赞成如今关闭链接ACK和FIN
通常都会分开发送,从而致使多了一次。为何不能用两次握手进行链接?
如下是网上广泛的解答:
若创建链接只需两次握手,客户端并无太大的变化,仍然须要得到服务端的应答后才进入ESTABLISHED
状态,而服务端在收到链接请求后就进入ESTABLISHED
状态。
此时若是网络拥塞,客户端发送的链接请求迟迟到不了服务端,客户端便超时重发请求,若是服务端正确接收并确认应答,双方便开始通讯,通讯结束后释放链接。此时,若是那个失效的链接请求抵达了服务端,因为只有两次握手,服务端收到请求就会进入ESTABLISHED
状态,等待发送数据或主动发送数据
但此时的客户端早已进入CLOSED
状态,服务端将会一直等待下去,这样浪费服务端链接资源
但我以为这个只是两次握手可能形成的问题,最关键的是两次握手有服务器对客户端的起始序列号作了确认,但客户端却没有对服务器的起始序列号作确认
,不能保证传输的可靠性。
若是已经创建了链接,可是客户端忽然出现故障了怎么办?
TCP保活计时器 每次客户端请求服务器会重置计时器,当2小时以内
没收到客户端任何数据时,会每隔75s
向客户端发一个探测报文,若接连发送10个
,客户端都没有反应,则认为客户端故障,关闭链接。
什么是SYN洪泛攻击?
TCP的 SYN
,SYN是TCP三次握手中第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP链接就处于挂起状态,也就是半链接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。序号(ISN)为何要随机?
增长安全性,为了不被第三方猜想到,从而被第三方伪造的RST报文Reset。
三次握手的第一次能够携带数据吗?为什么?
SYN FLOOD
(SYN洪泛)攻击。三次握手的第三次能够携带数据吗?为什么?
第三次握手,此时客户端已经处于ESTABLISHED
状态。对于客户端来讲,他已经创建起链接了,而且已经知道服务器的接收和发送能力是正常的。因此也就能够携带数据了。
主要经过如下四种方式实现可靠传输机制:
为何须要流量控制呢?
好比发送方发送速度很是快,接收方接收速度特别慢,这样就会发生严重的丢包现象。
TCP经过滑动窗口的机制来实现流量控制。简单来讲以下(建议网上找一个动画教程来理解,文字效果不是很好):
滑动窗口的大小意味着接收方还有多大的缓冲区能够用于接收数据
。发送方能够经过滑动窗口的大小来肯定应该发送多少字节的数据。0
时,发送方通常不能再发送数据报
,但有两种状况除外,一种状况是能够发送紧急数据,例如,容许用户终止在远端机上的运行进程。另外一种状况是发送方能够发送一个 1 字节的数据报来通知接收方从新声明它但愿接收的下一字节及发送方的滑动窗口大小。这部分我也以为文字部分太生硬了,开始我也不怎么理解,看来一个视频以后我了解了基本原理,这里我文字版和视频地址都放上来。
视频地址以下:拥塞控制视频版
文字版以下:
若是网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而致使网络拥塞程度更高。所以当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,可是出发点不一样。流量控制是为了让接收方能来得及接收,而拥塞控制是为了下降整个网络的拥塞程度。
TCP 主要经过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
发送方须要维护一个叫作拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
为了便于讨论,作以下假设:
接收方有足够大的接收缓存,所以不会发生流量控制;
虽然 TCP 的窗口基于字节,可是这里设窗口的大小单位为报文段。
慢开始与拥塞避免
发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,所以以后发送方可以发送的报文段数量为:二、四、8 ...
注意到慢开始每一个轮次都将 cwnd 加倍,这样会让 cwnd 增加速度很是快,从而使得发送方发送的速度增加速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每一个轮次只将 cwnd 加 1。
若是出现了超时,则令 ssthresh = cwnd / 2,而后从新执行慢开始。
快重传与快恢复
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
在发送方,若是收到三个重复确认,那么能够知道下一个报文段丢失,此时执行快重传,当即重传下一个报文段。例如收到三个 M2,则 M3 丢失,当即重传 M3。
在这种状况下,只是丢失个别报文段,而不是网络拥塞。所以执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增加速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。
应用层对应用程序的通讯提供服务。
一些比较重要的应用层协议以下图:
第一种是客户端/服务器模型,也就是C/S架构。好比电子邮件、web都是。
第二种是P2P模型,每一个主机既能够提供服务,也能够请求服务。好比迅雷下载也是使用P2P技术的。
而TCP链接有两种工做方式:短链接方式(Short-Live Connection)和长链接方式(Long-Live Connection)。
当客户端有请求时,会创建一个TCP链接,接收到服务器响应后,就断开链接。下次有请求时,再创建链接,收到响应后,再断开。如此循环。这种方式主要有两个缺点:
创建TCP链接须要3次“握手”,拆除TCP链接须要4次“挥手”,这就须要7个数据包。若是请求和响应各占1个数据包,那么一次短链接的交互过程,有效的传输仅占2/9,这个利用率过低了。
主动断开TCP链接的一端,TCP状态机会进入TIME_WAIT状态。若是频繁地使用短链接方式,就有可能使客户端的机器产生大量的处于TIME_WAIT状态TCP链接。
什么是DNS说白了就是将域名转化为ip,好比www.qq.com,这是域名,能够是网络包须要对方ip地址,域名是不能加入网络包报头的,因此就须要去找一个服务器问,qq的域名对应的ip是多少。
大概的通讯过程以下:
DNS
的客户端,就是咱们的PC机或者手机客户端运行着DNS客户端了http://www.baidu.com/
, 并将这个主机名传送给DNS应用的客户端查询报文
,报文中包含着要访问的主机名字段
(中间包括一些列缓存查询以及分布式DNS集群的工做)回答报文
,其中包含有该主机名对应的IP地址
这里须要补充一个小知识,关于域名的,大概了解一下就行
万维网www是一个大规模的、联机式的信息存储所,是无数个网络站点和网页的集合。
知识盲区: 在很多人看来,互联网、因特网、万维网没有大多的区别,其实这三者之间的关系应该是:互联网包含因特网,因特网包含万维网。
互联网internet
。凡是由能彼此通讯的设备组成的网络就叫互联网,即便仅有两台机器(计算机、手机等),不论用何种技术使其彼此通讯,都叫互联网,因此,互联网有广域网、城域网及局域网之分,国际标准的互联网写法是internet,字母i必定要小写!
因特网Internet
。而因特网是互联网中的一种,它可不是仅有两台机器组成的网络,而是由上千万台设备组成的网络(该网络具有很大的规模)。因特网使用TCP/IP协议
让不一样的设备能够彼此通讯。但使用TCP/IP协议
的网络并不必定是因特网,一个局域网也能够使用TCP/IP协议
。
因特网是基于TCP/IP协议
实现的,TCP/IP协议
由不少协议组成,不一样类型的协议又被放在不一样的层,其中,位于应用层的协议就有不少,好比FTP、SMTP、HTTP
。因此,因特网提供的服务通常包括有:www(万维网)服务、电子邮件服务(outlook)、远程登陆(QQ)服务、文件传输(FTP)服务、网络电话
等等。
万维网
。只要应用层使用的是HTTP协议,就称为万维网(World Wide Web)
。之因此在浏览器里输入百度网址时,能看见百度网提供的网页,就是由于您的我的浏览器和百度网的服务器之间使用的是HTTP协议在交流。
万维网使用统一资源定位符做为标识符来访问资源。
URL的格式以下:
超文本传输协议(http)
传送给使用者。万维网服务器请求万维网文档
,以及服务器怎样把文档传送给浏览器
。http报文头分析:
下面是对各部分的简要描述:
方法(method):客户端但愿服务器对资源执行的动做,是一个单独的词,好比,GET、POST或HEAD
请求URL(request-URL):要直接与服务器进行对话,只要请求URL是资源的绝对路径
就能够了,服务器能够假定本身是URL的主机/端口
版本(version):报文所使用的HTTP版本
。其格式:HTTP/<主要版本号>.<次要版本号>
状态码(status-code):状态码是三位数字,描述了请求过程当中所发生的状况
。每一个状态码的第一位数字都用于描述状态的通常类别(好比,“成功”、“出错”等等)
缘由短语(reason-phrase):数字状态码的可读版本,包含行终止序列以前的全部文本。缘由短语只对人类有意义,所以,尽管响应行HTTP/1.0 200 NOT OK
和HTTP/1.0 200 OK
中缘由短语的含义不一样,但一样都会被看成成功指示处理
头部(header):能够有零个或多个头部,每一个首部都包含一个名字,后面跟着一个冒号(:),而后是一个可选的空格,接着是一个值,最后是一个CRLF首部是由一个空行(CRLF)结束的,表示了头部列表的结束和实体主体部分的开始
实体的主体部分(entity-body):实体的主体部分包含一个由任意数据组成的数据块,并非全部的报文都包含实体的主体部分,有时,报文只是以一个CRLF结束。
下面是经常使用头部:
通用头部:既能够出如今请求报文中,也能够出如今响应报文中,它提供了与报文相关的最基本的信息
Connection:容许客户端和服务器指定与请求/响应链接有关的选项,http1.1默认是keep-alive
Date:提供日期和时间标志,说明报文是什么时间建立的
Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式
Cache-Control:用于随报文传送缓存指示
请求头部:请求头部是只在请求报文中有意义的头部。用于说明是谁或什么在发送请求、请求源自何处,或者客户端的喜爱及能力
Host:给出了接收请求的服务器的主机名和端口号
Referer:提供了包含当前请求URI的文档的URL
User-Agent:将发起请求的应用程序名称告知服务器
Accept:告诉服务器可以发送哪些媒体类型
Accept-Encoding:告诉服务器可以发送哪些编码方式
Accept-Language:告诉服务器可以发送哪些语言
Range:若是服务器支持范围请求,就请求资源的指定范围
If-Range:容许对文档的某个范围进行条件请求
Authorization:包含了客户端提供给服务器,以便对其自身进行认证的数据
Cookie:客户端用它向服务器传送数据
响应头部:响应头部为客户端提供了一些额外信息,好比谁在发送响应、响应者的功能,甚至与响应相关的一些特殊指令
Age:(从最初建立开始)响应持续时间
Server:服务器应用程序软件的名称和版本
Accept-Ranges:对此资源来讲,服务器可接受的范围类型
Set-Cookie:在客户端设置数据,以便服务器对客户端进行标识
实体首部:描述主体的长度和内容,或者资源自身
Allow:列出了能够对此实体执行的请求方法
Location:告知客户端实体实际上位于何处,用于将接收端定向到资源的位置(URL)上去
Content-Base:解析主体中的相对URL时使用的基础URL
Content-Encoding:对主体执行的任意编码方式
Content-Language:理解主体时最适宜使用的天然语言
Content-Length:主体的长度
Content-Type:这个主体的对象类型
ETag:与此实体相关的实体标记
Last-Modified:这个实体最后一次被修改的日期和时间
实体的主体部分:该部分其实就是HTTP要传输的内容,是可选的。HTTP报文能够承载不少类型的数字数据,好比,图片、视频、HTML文档电子邮件、软件应用程序等等。
经常使用的HTTP方法和状态码就不详细介绍了,本文完结!你这都能耐心看完,我以为你太厉害了!