IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 计算机网络重点 -> 正文阅读

[网络协议]计算机网络重点

计算机网络主要就是TCP/IP协议栈

  • TCP/IP协议体系的认知

???????? 分层,一部分用户,一部分内核;层与层的透明性;传输在每一层对等

  • 数据链路层

以太网帧的格式

MTU的概念

ARP协议:报文格式、查询原理、ARP缓存/RARP协议

MAC地址和IP地址互查的概念

  • 网络层

IP首部格式:16位分片标识、DF不分片标志、MF更多分片标志、13位片偏移

IP分片(如何避免)

IP选路

ICMP协议:报文格式、报文的两大分类:查询+差错

  • 传输层

UDP协议:特点、首部各个字段

TCP协议:特点、首部字段、可靠机制、连接控制机制(三次握手、四次挥手)、流量控制机制(滑动窗口、慢启动、拥塞避免、快速重传、快速恢复)、超时重传机制(各种定时器)

Question:为什么三次握手、四次挥手;为什么UDP和TCP都存在于伪包头

  • 应用层

DNS协议(名字空间、指针查询基本原理、DNS缓存)

FTP协议(网络界的活化石):两条连接(控制连接+·数据连接)、两种工作模型(PASV+PORT)

HTTP协议:报文格式、http状态码

HTTPS协议:详细握手过程、摘要算法

常见问题

OSI 有哪几层,会画出来,知道主要几层的各自作用

http://www.ha97.com/wp-content/uploads/image/2010/09/162558wtA.jpg

1. 应用层(数据):确定进程之间通信的性质以满足用户需要以及提供网络与用户应用

2. 表示层(数据):主要解决拥护信息的语法表示问题,如加密解密

3. 会话层(数据):提供包括访问验证和会话管理在内的建立和维护应用之间通信的机

制,如服务器验证用户登录便是由会话层完成的

4. 传输层(段):实现网络不同主机上用户进程之间的数据通信,可靠与不可靠的传输,传输层的错误检测,流量控制等

5. 网络层(包):提供逻辑地址(IP)、选路,数据从源端到目的端的传输

6. 数据链路层(帧):将上层数据封装成帧,用 MAC 地址访问媒介,错误检测与修正

7. 物理层(比特流):设备之间比特流的传输,物理接口,电气特性等

TCP/IP五层模型

1、物理层:负责光电信号传递方式。集线器工作在物理层。以太网协议。

2、数据链路层:负责设备之间的数据帧的传输和识别。交换机工作在数据链路层。例如网卡设备的驱动,帧同步,冲突检测,数据差错校验等工作。

3、网络层:负责地址管理和路由选择。路由器工作在网络层。

4、传输层:负责两台主机之间的数据传输。

5、应用层:负责应用程序之间的沟通。网络编程主要针对的就是应用层。

除了层的数量之外,开放式系统互联(OSI)模型与TCP/IP协议有什么区别?

  • TCP/IP协议中的应用层处理开放式系统互联模型中的第五层、第六层和第七层的功能。
  • TCP/IP协议中的传输层并不能总是保证在传输层可靠地传输数据包,而开放式系统互联模型可以做到。TCP/IP协议还提供一项名为UDP(用户数据报协议)的选择。UDP不能保证可靠的数据包传输。

知道各个层使用的是哪个数据交换设备

  1. 中继器:物理层

主要功能:通过对数据信号的重新发送或者转发,来扩大网络传输的距离。

  1. 集线器:物理层

主要功能:是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。

工作原理:集线器就是一种共享设备,HUB本身不能识别目的地址,当同一局域网内的A主机给B主机传输数据时,数据包是以广播方式传输的,由每一台终端通过验证数据包头的地址信息来确定是否接收。

优点:连接多个不同的局域网;价格便宜,组网灵活。

缺点:不具备交换功能;同时传送多份数据时可能造成数据包的冲突问题。

  1. 网桥:数据链路层

https://img-blog.csdn.net/20171016141956814?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGN5bW9ybmluZ3N1bg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

主要功能:连接不同网段的计算机网络设备同时它又可隔离冲突域,因为它的两个端口不是共享一条背板总线,比当时的集线器性能更好,后来被交换机取代。

工作原理:网桥的A端口连接A子网,B端口连接B子网,有两个表A和B,当有数据包进入端口A时,网桥从数据包中提取出源MAC地址和目的MAC地址并记录在表,从而实现对MAC 地址进行分区,隔离不同物理网段之间的碰撞。

优点:提高了可靠性;扩大了物理范围;过滤通信量。

缺点:增加时延;只适合于用户数不太多(不超过几百个)和信息量不太大的局域网。

  1. 交换机:数据链路层

https://img-blog.csdn.net/20171016142002626?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGN5bW9ybmluZ3N1bg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

主要功能:具有集线器一样的集中连接功能,同时它又具有网桥的数据交换功能。所以可以这样说,交换机是带有交换功能的集线器,或者说交换机是多端口的网桥。

工作原理:识别数据包中的 MAC 地址信息,根据 MAC 地址进行转发,并将这些 MAC 地址与对应的端口记录在自己内部的一个地址表中。

优点(对比网桥):具有多个交换端口;数据转发效率更高;更强的MAC地址自动学习能力。

缺点:终端多延迟高(只能满足小规模几千局域网额互联互通)。

  1. 路由器:网络层

主要功能:具有判断网络地址和选择路径的功能。主要工作就是为经过路由器的每个数据帧寻找一条最佳传输路径,并将该数据有效地传送到目的站点。

把数据(IP 报文)传送到正确的网络,细分则包括:

IP 数据报的转发,包括数据报的寻径和传送;

子网隔离,抑制广播风暴;

维护路由表,并与其它路由器交换路由信息,这是 IP 报文转发的基础;

IP 数据报的差错处理及简单的拥塞控制;

实现对 IP 数据报的过滤和记帐。

工作原理:工作站A需要向工作站B传送信息(并假定工作站B的IP地址为120.0.5),它们之间需要通过多个路由器的接力传递。路由器1收到工作站A的数据帧后,先从报头中取出地址120.0.5,并根据路径表计算出发往工作站B的最佳路径:R1-R2-R5-B;并将数据帧发往路由器2。

优点:适用于大规模的网络;复杂的网络拓扑结构,负载共享和最优路径;安全性高。

缺点:不支持非路由协议;安装复杂;价格高。

  1. 网关:传输层、应用层

主要功能:网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连,网关既可以用于广域网互连,也可以用于局域网互连。

  1. ARP协议(数据链路层)

???????? 地址解析协议,其作用是在以太网环境中,数据的传输所依赖的是MAC地址而非IP地址,而将已知IP地址转换为MAC地址的工作是由ARP协议来完成的。

ARP报文总共 28 个字节。(记忆方法)以太网先目地端后发送端, ARP 先发送端后目地端。先硬件后协议。

???????? 代理ARP若 ARP 请求是从一个网络的主机发送给另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程叫做 ARP 代理。 ARP 代理路由器响应 ARP 请求的 MAC 地址为路由器的 MAC 地址而非 ARP 请求的主机的 MAC 地址。使用场景:两个物理网络之间的路由是使用相同的网络号,两个路由器设置成 ARP 代理,实现相互隐

瞒物理网络。

???????? 免费ARP指主机发送 ARP 查找自己的 IP 地址,即数据链路层 SIP=DIP。

作用有两个:1)一个主机使用免费 ARP 确定是有存在有其他主机设置了相同的 IP 地址

2)如果发送免费 ARP 的主机改变了 MAC 地址,可以通过发送免费 ARP 的方式告知其他

主机端更新 ARP 表

数据链路层 MTU 的最大值和最小值是多少?

  1. 数据链路层的最小MTU 为 64 字节。对于 IEEE802.3,两个站点的最远距离不超过 2500m,由 4 个中继器连接而成,其冲突窗口为 51.2us(2 倍电缆传播延迟加上 4 个中继器的双向延迟).对于 10Mbps 的 IEEE802.3 来说,这个时间等于发送 64 字节,即 512 位的时间,64 字节就是由此而来的。如果一个站点已经传输了 512bit,就认为它已经占用了这个信道。
  2. 数据链路层的最大 MTU 为 1500 字节,即数据字段的最大长度。

IP协议(网络层)

???????? IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。

???????? 无状态是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。这种服务最大的缺点就是无法处理乱序和重复的IP数据报。面向连接的协议,比如TCP协议,能够自己处理乱序的、重复的报文段,它递交给上层协议的内容绝对是有序的、正确的。无状态服务的优点也很明显:简单、高效。我们无需为保持通信的状态而分配一些内核资源,也无需每次传输数据时都携带状态信息。

???????? 无连接是指IP通信双方都不长久地维持对方的任何信息。这样上层协议每次发送数据的时候,都必须明确指定对方的IP地址。

???????? 不可靠指的是不能保证数据报能成功地到达目的地。发生错误时候,丢弃该数据包,发送 ICMP 消息给信源端。 可靠性由上层提供。

???????? IP 报文的格式和各个字段的含义:

IPv4的头部结构如下所示,其长度通常为20个字节,除非含有可变长的选项部分。

https://images2015.cnblogs.com/blog/916092/201707/916092-20170707142324331-1201756642.png

版本:包含IP数据报的版本号:ipv4为4,ipv6为6。

首部长度:其中保存的是整个首部中的“32位字”的数量。这个字段正常的值为:5(假设“可选字段长度为0”);该字段最大值为:15(可选字段长度全满加上原有字段)

区分服务:优先级(3位)和数据链路层的QoS机制有关,定义了8个服务级别。当Qos选择了某种服务模型后,优先级越高,字段越优先传输。D、T、R分别表示延时、吞吐量、可靠性。当这些值都为1时,分别表示低延时、高吞吐量、高可靠性。

https://images2015.cnblogs.com/blog/916092/201707/916092-20170707142344112-157650607.png

ECN用于为数据报标记“拥塞标识符”。

总长度:该字段指的是IPv4数据报的总长度(以字节为单位)。通过该字段和“首部长度”字段,我们可以推测出ip数据报中“数据部分”从哪开始以及长度。

16位标识:唯一地标识主机发送地每一个数据报。其初始值由系统随机生成,没发送一个数据报,其值就加1.该值在数据报分片时被复制到每个分片中,因此同一个数据报地所有分片都具有相同地标识。

3位标志字段:第一位保留。第二位表示"禁止分片"。如果设置了这个位,IP模块将不对数据报进行分片。在这种情况下,如果IP数据报长度超过MTU的话,IP模块将丢弃该数据报并返回一个ICMP差错报文。第三位表示“更多分片”。除了数据报的最后一个分片外,其他分片都要把它置1。

13位分片偏移:分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移3位(乘8)后得到的。由于这个原因,除了最后一个IP分片外,每个IP分片的数据部分的长度必须是8的整数倍(这样才能保证后面的IP分片拥有一个合适的偏移量)。

生存时间TTL该字段用于设置一个“数据报可经过的路由器数量”的上限。发送方在初始发送时设定某个值(建议为64,、128或255),每台路由器再转发时都将其减一,当字段达到0时,该数据报被丢弃,并使用一个ICMP消息通知发送方。

8位协议:用来区分上层协议,/etc/protocols文件定义了所有上层协议对应的protocol字段的数值。其中ICMP是1,TCP是6,UDP是17。

16位头部校验和:由发送端填充(对首部(计算16位二进制反码和),接收端对其使用CRC算法以检验IP数据报头部在传输过程中是否损坏。

32位的源端IP地址和目的端IP地址:用来标识数据报的发送端和接收端。一般情况下,这两个地址在整个数据报的传递过程中保持不变,而不论它中间经过多少个中转路由器。

可选字段:最多包含40个字节,包括记录路由、时间戳、松散源路由选择、严格源路由选择

IP 首部校验和怎么计算的,与 ICMP, IGMP, TCP, UDP 的首部校验和有什么区别与共同点?

(1) 先把校验和字段置 0。

(2) 对首部中每个 16 位比特进行二进制反码求和。

(3) 结果存在检验和字段中。

(4) 收到一份 IP 数据包后,同样对首部中每个 16bit 二进制反码求和。

(5) 异或最后结果全为 1,表示正确,否则表示错误。

(6) 如果是错误的, IP 就丢弃该数据报,但是不生成差错报文,由上层去处理。

???????? 共同点:用到的算法都是一样的。

???????? 区别: IP 计算的时候没有将数据包括在内。ICMP, IGMP, TCP, UDP 同时覆盖首部和数据检验码。

IP分片

???????? 前文提到过,当IP数据报的长度超过帧的MTU时,它将被分片传输。分片可能发生在发送端,也可能发生在中转路由器上,而且可能在传输过程中多次分片,但只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。

? ? IP头部中的如下三个字段给IP的分片和重组提供了足够的信息:数据报标识、标志和片偏移。一个IP数据报的每个分片都具有自己的IP头部,它们具有相同的标识值,但具有不同的片偏移。并且除了最后一个分片外,其他分片都将设置MF标志。此外,每个分片的IP头部的总长度字段将被设置位该分片的长度。

? ? 以太网帧的MTU时1500字节,因此它携带的IP数据报的数据部分最多是1480字节(IP头部占用20字节)。考虑用IP数据报封装一个长度为1481字节的ICMP报文(包括8字节的ICMP头部,所以其数据部分长度为1473字节),则该数据报在使用以太网帧传输时必须被分片,如下:

https://img-blog.csdn.net/20180906200129195?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzI3MjE4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

???????? 上图中,长度为1501字节的IP数据被拆分成两个IP分片,第一个IP分片长度为1500字节,第二个IP分片的长度为21个字节。每个IP分片都包含自己的IP头部(20字节),且第一个IP分片的IP头部设置了MF标志,而第二个IP分片的IP头部则没有设置该标志,因为它已经是最后一个分片了。原始IP数据报中的ICMP头部内容被完整地复制到了第一个IP分片中。第二个IP分片不包含ICMP头部信息,因为IP模块重组该ICMP报文地时候只需要一份ICMP头部信息,重复传送这个信息没有任何益处。1473字节地ICMP报文数据的前1472字节被IP模块复制到第一个IP分片中,使其总长度为1500字节,从而满足MTU的要求;而多出最后1字节则被复制到第二个IP分片中。

? ? ? 需要指出的是,ICMP报文的头部长度取决于报文的类型,其变化范围很大,上图以8字节为例。

???????? 分片的问题:

  1. 性能消耗:分片和重组会消耗发送方、接收方一定的CPU等资源,如果存在大量的分片报文的话,可能会造成较为严重的资源消耗;
  2. 分片丢包导致的重传问题
  3. 分片攻击:黑客构造的分片报文,但是不向接收方发送最后一个分片报文,导致接收方要为所有的分片报文分配内存空间,可由于最后一个分片报文永远不会达到,接收方的内存得不到及时的释放,只要这种攻击的分片报文发送的足够多、足够快,很容易占满接收方内存,让接收方无内存资源处理正常的业务,从而达到DOS的攻击效果;
  4. 安全隐患:由于分片只有第一个分片报文具有四层信息而其他分片没有,这给路由器、防火墙等中间设备在做访问控制策略匹配的时候带来了麻烦。

避免分片:

???????? 对于UDP包,我们需要在应用层去限制每个包的大小,一般不要超过1472字节,即以太网MTU(1500)—UDP首部(8)—IP首部(20)。

???????? 对于TCP数据,应用层就不需要考虑这个问题了,因为传输层已经帮我们做了。在建立连接的三次握手的过程中,连接双方会相互通告MSS(Maximum Segment Size,最大报文段长度),MSS一般是MTU—IP首部(20)—TCP首部(20),每次发送的TCP数据都不会超过双方MSS的最小值,所以就保证了IP数据报不会超过MTU,避免了IP分片。

IP选路

???????? IP协议的一个核心任务是数据报的路由,即决定发送数据报到目标机器的路径。

IP模块工作流程:

https://img-blog.csdn.net/20180906202016875?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzI3MjE4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

???????? 从右往左分析上图,当IP模块接收到来自数据链路层的IP数据报时,它首先对该数据报的头部做CRC校验,确认无误之后就分析其头部的具体信息。

?? ???? 如果该IP数据报的头部设置了源站选路选项(松散源路由选择或严格源路由选择),则IP模块调用数据报转发子模块来处理该数据报。如果该IP数据报的头部中目标IP地址是本机的某个IP地址,或者是广播地址,即该数据是发送给本机的,则IP模块就根据数据报头部中的协议字段来决定将它派发给哪个上层应用。如果IP模块发现这个数据报不是发送给本机的,则也调用数据报转发子模块来处理该数据报。

?? ???? 数据报转发子模块将首先检测系统是否允许转发,如果不允许,IP模块就将数据报丢弃。如果允许,数据报转发子模块将对该数据报执行一些操作,然后将它交给IP数据报输出子模块。

?? ???? IP数据报应该发送至哪个下一跳路由(或者目标主机),以及经过哪个网卡来发送,就是IP路由过程,即图中“计算下一跳路由”子模块。IP模块实现数据报路由的核心数据结构是路由表。这个表按照数据报的目标IP地址分类,同一类型的IP数据报将被发往相同的下一跳路由器(或者目标主机)。

???????? IP输出队列中存放的是所有等待发送的IP数据报,其中除了需要转发的IP数据报外,还包括封装了本机上层数据(ICMP报文、TCP报文和UDP数据报)的IP数据报。

?? 图中的虚线箭头显示了路由表更新的过程。这一过程是指通过路由协议 或者route命令调整路由表,使之更适应最新的网络拓扑结构,成为IP路由策略。

路由表的内容:

https://img-blog.csdn.net/20180909095725796?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzI3MjE4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

???????? 查找路由表中的数据报的目标IP地址完全匹配的主机IP地址。如果找到,就是用该路由项,没找到则转步骤2.;

???????? 查找路由表中的数据报目标IP地址具有相同网络ID的网络IP地址。如果找到,就使用该路由项;没找到则转步骤3;

???????? 选择默认路由项,这通常意味着数据报的下一跳路由是网关。

  1. 如果路由表中没有默认项,而又没有找到匹配项,这时如何处理?

???????? 结果取决于该 IP 数据报是由主机产生的还是被转发的。

???????? 如果数据报是由本机产生的,那么就给发送该数据报的应用程序返回一个差错,或者是“主机不可达差错”或者是“网络不可达差错”。

???????? 如果是被转发的数据报,就给原始发送一份 ICMP 主机不可达的差错报文。

  1. IP 地址的分类,如何划分的,及会计算各类地址支持的主机数

???????? IP地址由四段组成,每个字段是一个字节,8位,最大值是255,,

???????? IP地址由两部分组成,即网络地址和主机地址。网络地址表示其属于互联网的哪一个网络,主机地址表示其属于该网络中的哪一台主机。二者是主从关系。

https://images2018.cnblogs.com/blog/1440532/201809/1440532-20180912093201807-306001370.png

???????? IP地址根据网络号和主机号来分,分为A、B、C三类及特殊地址D、E。??? 全0和全1的都保留不用。

???????? A类:(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。

???????? B类:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。

???????? C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0或 0xFFFFFF00)前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。

???????? D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户[1]? 。

???????? E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。

ICMP协议(网络层)

???????? IP协议是一种面向无连接的数据报协议,它是一种不可靠的协议,它不提供任何差错检验。因此网际报文控制协议(Internet Control Message Protocol)ICMP出现了,ICMP协议用于IP主机、路由器之间传递控制消息,这里的控制消息可以包括很多种:数据报错误信息、网络状况信息、主机状况信息等,虽然这些控制消息虽然并不传输用户数据,但对于用户数据报的有效递交起着重要作用,从TCP/IP的分层结构看ICMP属于网络层,它配合着IP数据报的提交,提高IP数据报递交的可靠性。

ICMP报文类型:

???????? ICMP报文可以分为两大类:ICMP差错报告报文和ICMP查询报文。差错报告报文主要用来向IP数据报源主机返回一个差错报告信息,这个错误报告信息产生的原因是路由器或主机不能对当前数据报进行正常的处理,例如无法将数据报递交给有效的协议上层,数据报因为生存时间TTL为0而被删除等。查询报文用于一台主机向另一台主机查询特定的信息,通常查询报文都是成对出现的,即源主机发起一个查询报文,在目的主机收到该报文后,会按照查询报文约定的格式为源主机返回一个应答报文。

???????? 注意,ICMP差错报文并不能纠正差错,它只是简单地报告差错,差错报告报文总是被返回给数据报的原始发出者,因为数据报中关于路由的唯一可用信息就是源IP地址和目的IP地址,路由器在不能正常处理数据报时,会产生相应的差错报文并返回给数据报源端。差错的纠正需要留给高层协议,当源主机网络层收到差错报告报文后,或者直接根据报文做出相应的处理,或者向更高层的协议通知这个差错信息,由上层协议选择处理。查询报文能用于对某些网络问题的诊断,也可用于网络设备信息的交互,查询报文都是成对出现的

ICMP报文格式:

https://img-blog.csdnimg.cn/20190315152029193.png

???????? 8位的类型字段标识了该ICMP报文的具体类型(第一类是取值为1~127的差错报文,第2类是取值128以上的信息报文),8位的代码字段进一步指出产生这种类型ICMP报文的原因,每种类型报文的产生的原因都可能有多个,就拿目的站不可达报文来说,产生的原因可能有主机不可达(给该主机寻路时,没有找到相应路径)、协议不可达、端口不可达等;16位校验和字段包括整个ICMP报文,即包括ICMP首部和数据区域。首部中的剩余4个字节在每种类型的报文中有特殊的定义。

什么情况不会导致产生 ICMP 差错报文?

1) ICMP 差错报文。

2) 目的地址是广播地址或者多播地址的 IP 数据报。

3) 链路层广播的数据报

4) 不是 IP 分片的第一片

???????? 5) 源地址不是单个主机的数据包。

ICMP 重定向差错报文

重定向报文只能有路由器生成,重定向报文是为主机而不是为路由器使用的。

???????? 1) 主机发送 IP 数据报给 R1,因为主机的默认路由指向的下一跳是 R1。

???????? 2) R1 收到数据报并且检查它的路由表,发现 R2 是发送该数据报的下一跳。当他将数据报发送给 R2 的时候,发现发送的接口与接受的端口是一样的,因此同时发送一个 ICMP 重定向报文给主机。

???????? 3) R1 接受到 ICMP 重定向报文后,接下来的数据报就发送给 R2,而不再发送给 R1。

Ping 命令的具体过程

http://www.360doc.com/content/10/0804/20/1278923_43700893.shtml

???????? 一般我们用 ping检测网络是否通畅或者网络连接速度,主要是检查两个指标:第一个是看看是不是超时;第二个看看是不是延迟太高。

工作原理

???????? 利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。

???????? 打开 Wireshark,选取指定的网卡进行抓包,进行 ping操作,在 A电脑上 ping B电脑的 IP,发现ping命令依托于ICMP协议和ARP协议:

Ping过程解析:

???????? A 电脑( 192.168.2.135)发起 ping请求, ping192.168.2.179(A和B在同一网段,局域网);

???????? A 电脑广播发起 ARP请求,查询 192.168.2.179的 MAC地址;

???????? 首先源主机会查看自己的MAC地址表,看看有没有目的主机的地址,如果没有则源主机会向外部发送ARP广播包(ICMP数据包);

???????? 当交换机接收到报文后,会查询交换机的MAC地址表,如果有目的主机的MAC地址,则直接返回给源主机,如果没有,交换机会向所有端口发送ARP广播,其他端口上的主机发现以后,如果目标不是自己,就会丢弃报文;

???????? 直到目的主机收到报文后,会响应自己的MAC地址是多少,同时学习源主机的MAC地址,并按照同样的格式报文返回源主机。

???????? B 电脑应答 ARP请求,向 A电脑发起单向应答,告诉 A电脑自己的 MAC地址为 90:A4:DE:C2:DF:FE;

???????? 知道了 MAC地址后,开始进行真正的 ping请求,由于 B电脑可以根据A电脑发送的请求知道 源 MAC地址,所以就可以根据源 MAC地址进行响应了。

???????? 弄懂了 ping的流程之后我们来解析下之前解释的 ICMP数据结果是否和抓包的一致。 我们来点击一个 ping request看看 ICMP协议详情,这里的 Type=8,code=0, 校验是正确,且这是一个请求报文。响应报文, Type=0,code=0,这里知道就是响应报文了,然后最后就是根据请求和响应的时间戳计算出来的响应延迟:3379.764ms-3376.890ms=2.874ms。

???????? 我们分析了一次完整的 ping请求过程, ping命令是依托于 ICMP协议的, ICMP协议的存在就是为了更高效的转发 IP数据报和提高交付成功的机会。 ping命令除了依托于 ICMP,在局域网下还要借助于 ARP协议, ARP协议能根据 IP地址反查出计算机的 MAC地址。另外 ARP是有缓存的,为了保证 ARP的准确性,计算机会更新ARP缓存。

UDP协议-用户数据报协议(传输层)

???????? UDP---用户数据报协议,是一个简单的面向数据报的运输层协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

特点:

???????? 面向非连接,时间上不存在建立连接需要的时延。空间上,TCP需要在端系统中维护连接状态,需要一定的开销。此连接装入包括接收和发送缓存,拥塞控制参数和序号与确认号的参数。UCP不维护连接状态,也不跟踪这些参数,开销小。空间和时间上都具有优势。

不维护连接状态支持同时向多个用户传输相同的信息。

???????? 数据包报头只有8个字节(TCP首部20字节),额外开销较小。

???????? UDP没有拥塞控制,应用层能够更好的控制要发送的数据和发送时间,网络中的拥塞控制也不会影响主机的发送速率。(吞吐量只受限于数据生成速率、传输速率以及机器性能)。

???????? UDP提供尽最大努力的交付,不保证可靠交付,不需要维持复杂的链接状态表。

???????? UDP是面向报文的,对应用层交下来的报文,添加首部后直接向下交付为IP层,既不合并,也不拆分,保留这些报文的边界。对IP层交上来UDP用户数据报,在去除首部后就原封不动地交付给上层应用进程,报文不可分割,是UDP数据报处理的最小单位。

UDP报头字段:

???????? 源端口号(2字节)

???????? 目地端口号(2)

???????? UDP 长度:是 UDP 的报文总长度,是多余的。IP总长度减去首部长度就是此值。(2)

???????? UDP 校验和:检测UDP数据报在传输中是否有错,有错则丢弃。该字段是可选的,当源主机不想计算校验和,则直接令该字段全为0。(2)

UDP校验和:

???????? UDP 的校验和要计算首部和数据部分。首部还包括伪首部。伪首部并不是UDP真正的首部。只是在计算校验和,临时添加在UDP数据报的前面,得到一个临时的UDP数据报。校验和就是按照这个临时的UDP数据报计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。这样的校验和,既检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验。

???????? ?

???????? 伪首部并非TCP&UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。这样的校验和,既校验了TCP&UDP用户数据的源端口号和目的端口号以及TCP&UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。伪报头保证TCP&UDP数据单元到达正确的目的地址。因此,伪报头中包含IP地址并且作为计算 校验和需要考虑的一部分。最终目的端根据伪报头和数据单元计算校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。

TCP协议-传输控制协议(运输层)

  TCP协议提供的是面向连接、可靠的基于字节流的传输层通信协议。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

TCP可靠性来自于:

(1)应用数据被分成TCP最合适的发送数据块;

(2)当TCP发送一个段之后,启动一个定时器,等待目的点确认收到报文,如果不能及时收到一个确认,将重发这个报文;

(3)当TCP收到连接端发来的数据,就会推迟几分之一秒发送一个确认;

(4)TCP将保持它首部和数据的检验和,这是一个端对端的检验和,目的在于检测数据在传输过程中是否发生变化。(有错误,就不确认,发送端就会重发);

(5)TCP是以IP报文来传送,IP数据是无序的,TCP收到所有数据后进行排序,再交给应用层;

(6)IP数据报会重复,所以TCP会去重;

(7)TCP能提供流量控制,TCP连接的每一个地方都有固定的缓冲空间。TCP的接收端只允许另一端发送缓存区能接纳的数据;

(8)TCP对字节流不做任何解释,对字节流的解释由TCP连接的双方应用层解释。

  1. TCP消息

https://img-blog.csdnimg.cn/20190818161727869.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dkaXJkbw==,size_16,color_FFFFFF,t_70

?????? TCP数据是封装在一个IP数据中。

? ●源、目标端口号字段:占16比特。TCP协议通过使用”端口”来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在”众所周知的端口”(Well-Know Port)为用户提供服务。

 ●序列号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个字节编号。

 ●确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。

 ●数据偏移字段:占4比特。给出头部占32比特(已有固定的20字节)的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部(选项40字节)。

 ●标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:

 ◆URG:紧急指针(urgent pointer)有效。

 ◆ACK:为1时,确认序号有效。(带ACK标志的TCP报文段称为确认报文段)

 ◆PSH:为1时,接收方应该尽快将这个报文段交给应用层。

 ◆RST:为1时,重建连接。(RST标志的TCP报文段称为复位报文段

 ◆SYN:为1时,同步程序,建立连接时使用。

 ◆FIN:为1时,发送端完成任务,释放一个连接。

 ●窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。

 ●TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。

 ●紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

 ●选项字段:占32比特。可能包括”窗口扩大因子”、”时间戳”等选项。

TCP连接控制机制

  1. 三次握手

???????? 确认序号标志ACK:当ACK=1时,确认字段才有效;当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。

同步序号标志SYN:在请求连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。

终止连接标志FIN:用于释放连接。

  序列号seq: TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生。序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。

  确认号ack:期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。

整个流程为:

???????? 第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;

???????? 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

???????? 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

  1. 四次挥手

???????? 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

???????? 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。

???????? 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

???????? 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

为什么有TIME_WAIT、CLOSE_WAIT状态?

TIME_WAIT状态存在的理由:

1)可靠地实现TCP全双工连接的终止

?? 在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,因此客户端必须维护状态信息允许它重发最终的ACK。因而,要实现TCP全双工连接的正常终止,必须处理终止序列四个分节中任何一个分节的丢失情况,主动关闭的客户端必须维持状态信息进入TIME_WAIT状态。

2)允许老的重复分节在网络中消逝

???????? 在关闭某个连接后,过段时间有相同的IP地址和端口之间建立了另一个连接,TCP必须防止来自老的重复分组在该连接已经终止后再现。

???????? MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间将在网络中消失。

???????? 首先看理由1,为了可靠地实现全双工连接的终止,假设客户端发送的最后一个ACK丢失,服务端将重传FIN,为了能够收到这个超时重传的FIN,客户端需要TIME_WAIT状态;那TIME_WAIT状态就必须是2MSL了吗?其实这个要看服务端FIN的超时重传时间RTO,其实一般情况下,RTO都是远远小于MSL的,但考虑到最糟糕的情况,RTO是为2MSL,所以TIME_WAIT状态为2MSL可以保证最糟糕情况也可以收到超时重传的FIN。

???????? TIME_WAIT的时间是2MSL另外一个重要原因理由2,为了保证本连接持续的时间所产生的所有分组都从网络中消失,也就是保证新建立一个TCP连接时,来自该连接老的重复分组都已经在网络中消失了。

???????? 假设客户端发送ACK刚刚过了一个MSL时间,而服务端在收到这个ACK之前一瞬间刚好启动超时重传FIN,所以要等这个FIN也消失,就是2MSL了。文中所指的另一个方向的应答应该就是这个超时重传的FIN。

服务器出现大量CLOSE_WAIT状态的原因:

???????? 出现大量CLOSE_WAIT,只可能是客户端发送了FIN,服务端没有进一步发送ACK,或者FIN已经确认对方关闭socket连接,我方忙于读写,没有及时关闭连接。

解决:

检查代码,特别是释放资源的代码;

检查配置,特别是处理请求的线程配置

为什么要三次握手,四次挥手?

???????? 3次握手:防止已过期的连接请求报文突然又传送到服务器,因而产生错误。

???????? 4 次挥手:因为TCP连接是全双工的,因此,每个方向都必须要单独进行关闭连接。确保数据能够完成传输,但关闭连接时,当收到对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭 SOCKET,也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN 报文多数情况下都是分开发送的。

TCP协议与UDP协议区别

  1. 连接性:TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的;
  2. 可靠性:TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制;
  3. 实时性:UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信;
  4. 传输方式:每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信;
  5. 资源:TCP对系统资源要求较多,UDP对系统资源要求较少;
  6. 面向:TCP 面向报文, UDP 面向字节流。

应用场景:

普通的会议视频图像,当然首选UDP,毕竟丢包无所谓。传输文件等,不能丢包,用TCP。

TCP流量控制机制

一、为什么需要流量控制?

???????? 双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,这时候接收方只能把处理不过来的数据存在缓存区里(失序的数据包也会被存放在缓存区里)。

???????? 如果缓存区满了发送方还在疯狂着发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源,因此,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡才好。

???????? 对发送方发送速率的控制,我们称之为流量控制。

二、如何控制?

???????? 接收方每次收到数据包,可以在发送确定报文的时候,同时告诉发送方自己的缓存区还剩余多少是空闲的,我们也把缓存区的剩余大小称之为接收窗口大小,用变量win来表示接收窗口的大小。

???????? 发送方收到之后,便会调整自己的发送速率,也就是调整自己发送窗口的大小,当发送方收到接收窗口的大小为0时,发送方就会停止发送数据,防止出现大量丢包情况的发生。

三、发送方何时再继发送数据?

???????? 我们可以采用这样的策略:当接收方处理好数据,接受窗口 win > 0 时,接收方发个通知报文去通知发送方,告诉他可以继续发送数据了。当发送方收到窗口大于0的报文时,就继续发送数据。

???????? 不过这时候可能会遇到一个问题,假如接收方发送的通知报文,由于某种网络原因,这个报文丢失了,这时候就会引发一个问题:接收方发了通知报文后,继续等待发送方发送数据,而发送方则在等待接收方的通知报文,此时双方会陷入一种僵局。

???????? 为了解决这种问题,我们采用了另外一种策略:当发送方收到接受窗口 win = 0 时,这时发送方停止发送报文,并且同时开启一个定时器,每隔一段时间就发个测试报文去询问接收方,打听是否可以继续发送数据了,如果可以,接收方就告诉他此时接受窗口的大小;如果接受窗口大小还是为0,则发送方再次刷新启动定时器。

注意:

  1. 由于TCP/IP支持全双工传输,因此通信的双方都拥有两个滑动窗口,一个用于接受数据,称之为接收窗口;一个用于发送数据,称之为拥塞窗口(即发送窗口)。指出接受窗口大小的通知我们称之为窗口通告。
  2. 早期的TCP协议中,接受接受窗口的大小是固定的,不过随着网络的发展,固定大小的窗口太不灵活了,在现在的TCP协议中,接受窗口的大小是根据某种算法动态调整的。
  3. 接受窗口如果太小的话,会严重浪费链路利用率,增加丢包率。当接收窗口达到某个值的时候,再增大的话也不怎么会减少丢包率的了,而且还会更加消耗内存。所以接收窗口的大小必须根据网络环境以及发送发的的拥塞窗口来动态调整。
  4. 接收方在发送确认报文的时候,会告诉发送发自己的接收窗口大小,而发送方的发送窗口会据此来设置自己的发送窗口,但这并不意味着他们就会相等。首先接收方把确认报文发出去的那一刻,就已经在一边处理堆在自己缓存区的数据了,所以一般情况下接收窗口 >= 发送窗口。

TCP拥塞控制机制

  1. 慢启动(慢开始):
  1. 慢开始不是指 cwnd 的增长速度慢(指数增长),而是指 TCP 开始发送设置 cwnd=1。
  2. 思路:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大

???????? 逐渐增加拥塞窗口的大小。这里用报文段的个数的拥塞窗口大小举例说明慢开始算法,???????? 实时拥塞窗口大小是以字节为单位的。

  1. 为了防止 cwnd 增长过大引起网络拥塞,设置一个慢开始门限(ssthresh 状态变量)

???????? 当 cnwd< ssthresh,使用慢开始算法

???????? 当 cnwd=ssthresh,既可使用慢开始算法,也可以使用拥塞避免算法

???????? 当 cnwd> ssthresh,使用拥塞避免算法

  1. 拥塞避免:

1. 拥塞避免并非完全能够避免拥塞,是说在拥塞避免阶段将拥塞窗口控制为按线性规律增

长,使网络比较不容易出现拥塞。

2. 思路:让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞控

制窗口加一。

???????? 无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为 1,执行慢开始算法。

  1. 快速重传:

1. 快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及

早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发

送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设

置的重传计时器时间到期。

2. 由于不需要等待设置的重传计时器到期,能尽早重传未被确认的报文段,能提高整个网

络的吞吐量。

3. 目的是防止某个数据包丢失或者损害导致这个数据包超时时间发生,可以提早避免。

  1. 快速恢复:

1. 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把 ssthresh 门限减半。

但是接下去并不执行慢开始算法。

2. 考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络

可能没有出现拥塞。所以此时不执行慢开始算法,而是将 cwnd 设置为 ssthresh 的大小,

然后执行拥塞避免算法。

  1. TCP流量控制和拥塞控制区别:

相同点:

(1)现象都是丢包;

(2)实现机制都是让发送方发的慢一点,少一点;

不同点:

(1)丢包的位置:流量控制丢包位置是在接收端上;拥塞控制丢包位置是在路由器上;

(2)作用的对象不同:流量控制的对象是接收方,怕发送方发的太快,使得接收方来不处理;拥塞控制的对象是网络,怕发送发发的太快,造成网络拥塞,使得网络来不及处理。

DNS协议(应用层)

概念:

???????? 域名解析协议, www.xxx.com 转换成 ip,能够使用户更方便的访问互联网,而不

用去记住能够被机器直接读取的 ip 地址(IP地址是面向主机的,而域名则是面向用户的)。

???????? DNS 协议运行在 UDP 协议之上,使用端口号 53。

主机解析域名的顺序:

???????? 浏览器缓存

???????? 找本机的 hosts 文件

???????? 路由缓存

???????? 找 DNS 服务器(本地域名、顶级域名、根域名):迭代查询、递归查询。

HTTP协议(应用层)

???????? 超文本传输协议(HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

???????? HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

HTTP工作原理:

???????? HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。以下是 HTTP 请求/响应的步骤:

  1. 客户端连接到Web服务器

???????? 一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com。

  1. 发送HTTP请求

???????? 通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

  1. 服务器接受请求并返回HTTP响应

???????? Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

  1. 释放连接TCP连接

???????? 若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

  1. 客户端浏览器解析HTML内容

???????? 客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

输入URL到页面加载的全过程:

  1. 输入网址:

当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,让你可以补全url地址。对于 googlechrome 的浏览器,他甚至会直接从缓存中把网页展示出来,就是说,你还没有按下 enter,页面就出来了。

  1. 域名解析:通过DNS解析到urlIP地址

1、请求一旦发起,浏览器首先要做的事情就是解析这个域名,一般来说,浏览器会首先查看本地硬盘的 hosts 文件,看看其中有没有和这个域名对应的规则,如果有的话就直接使用 hosts 文件里面的 ip 地址。

2、如果在本地的 hosts 文件没有能够找到对应的 ip 地址,浏览器会发出一个 DNS请求到本地DNS服务器 。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。

3、查询你输入的网址的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果,此过程是递归的方式进行查询。如果没有,本地DNS服务器还要向DNS根服务器进行查询。

4、根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。这种过程是迭代的过程。

5、本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。

  6、最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。

  1. 浏览器向 web 服务器发送一个 HTTP 请求

拿到域名对应的IP地址之后,浏览器会以一个随机端口(1024<端口<65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。这个连接请求到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。

建立了TCP连接之后,发起一个http请求。一个典型的 http request header 一般需要包括请求的方法,例如 GET 或者 POST 等,不常用的还有 PUT DELETE HEADOPTION以及 TRACE 方法,一般的浏览器只能发起 GET 或者 POST 请求。

  1. 服务器的永久重定向响应

服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“http://www.google.com/ 而非“http://google.com/”。

  为什么服务器一定要重定向而不是直接发送用户想看的网页内容呢?其中一个原因跟搜索引擎排名有关。如果一个页面有两个地址,就像http://www.yy.com/http://yy.com/,搜索引擎会认为它们是两个网站,结果造成每个搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。还有就是用不同的地址会造成缓存友好性变差,当一个页面有好几个名字时,它可能会在缓存里出现好几次。

  1. 浏览器跟踪重定向地址

现在浏览器知道了 "http://www.google.com/"才是要访问的正确地址,所以它会发送另一个http请求。

  1. 服务器处理请求

经过前面的重重步骤,我们终于将我们的http请求发送到了服务器这里,其实前面的重定向已经是到达服务器了,那么,服务器是如何处理我们的请求的呢?

后端从在固定的端口接收到TCP报文开始,它会对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,供上层使用。

  一些大一点的网站会将你的请求到反向代理服务器中,因为当网站访问量非常大,网站越来越慢,一台服务器已经不够用了。于是将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。此时,客户端不是直接通过HTTP协议访问某网站应用服务器,而是先请求到NginxNginx再请求应用服务器,然后将结果返回给客户端,这里Nginx的作用是反向代理服务器。同时也带来了一个好处,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。

  1. 服务器返回一个 HTTP 响应

经过前面的6个步骤,服务器收到了我们的请求,也处理我们的请求,到这一步,它会把它的处理结果返回,也就是返回一个HTTP响应。

  1. 浏览器显示 HTML
  2. 浏览器发送请求获取嵌入在 HTML 中的资源(如图片、音频、视频、CSSJS等等)

??

???????? GET和POST还有一个重大区别,简单的说:GET产生一个TCP数据包;POST产生两个TCP数据包。

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

HTTP状态码:

???????? 所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

???????? 1xx:指示信息——表示请求已接受,继续处理

???????? 2xx:成功——表示请求已被成功接收、理解、接受

???????? 3xx:重定向——要完成请求必须进行更进一步的操作

???????? 4xx:客户端错误——请求有语法错误或者请求无法实现

???????? 5xx:服务器端错误——服务器未能实现合法的请求

常见的状态码:

???????? 200 OK:客户端请求成功

???????? 301 Moved Permanently(永久移除):请求的URL已经移走。Response中应该包含一个Location URL,说明资源现在所处的位置

???????? 302 found:重定向

???????? 400 Bad Request:客户端请求有语法错误,不能被服务器所理解

???????? 401 Unaythorized:请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用

???????? 403 Forbidden:服务端禁止访问该资源

???????? 404 Not Found:请求资源不存在,输入了错误的URL

???????? 500 Internal Server Error:服务器发生了不可预期的错误

???????? 503 Server Unavaliable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常

URL

???????? 超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:

???????? 传送协议。

???????? 层级URL标记符号(为[//],固定不变)

???????? 访问资源需要的凭证信息(可省略)

???????? 服务器。(通常为域名,有时为IP地址)

???????? 端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略)

???????? 路径。(以“/”字符区别路径中的每一个目录名称)

???????? 查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)

???????? 片段。以“#”字符为起点

例子:

???????? 以http://www.luffycity.com:80/news/index.html?id=250&page=1 为例, 其中:

http,是协议;

www.luffycity.com,是服务器;

80,是服务器上的默认网络端口号,默认不显示;

/news/index.html,是路径(URI:直接定位到对应的资源);

?id=250&page=1,是查询。

HTTP中重定向和转发的区别:

  本质区别:转发是服务器行为,重定向是客户端行为

  重定向:两次请求,浏览器地址发生变化,可访问自身web之外的资源,传输的数据会丢失。

  请求转发:一次请求,地址不变,访问自身web资源,传输的数据不会丢失。

Cookie和Session的区别:

???????? 会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是cookie和session。Cookie通常在客户端记录信息确定用户身份,session通过服务器端记录信息确定用户身份。

???????? 由于HTTP协议为无状态协议,一旦数据交换完毕,客户端和服务端的连接就会关闭,再次交换数据需要建立新的连接,意味着服务器无法从连接上跟踪会话。

???????? cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个 WEB 站点会话间持久的保持数据。

???????? Session 是服务器端使用的一种记录客户端状态的机制,使用比cookie简单,session对象是在客户端第一次请求服务的时候创建的。

???????? 如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。

???????? 区别:

  1. cookie 数据保存在客户端, session 数据保存在服务器端的机制
  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session
  3. 设置cookie时间可以使cookie过期,但使用session-destory(),我们将会销毁会话
  4. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie
  5. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)
  6. 两者最大的区别在于生存周期,一个是IE启动到IE关闭(浏览器页面一关 ,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件(cookie)

HTTPS工作原理:

二、HTTPS通信过程

https://images2015.cnblogs.com/blog/742678/201612/742678-20161204233935881-538260881.png

???????? 首先看看组成HTTPS的协议:HTTP协议和SSL/TLS协议。HTTP协议就不用讲了,SSL/TLS就是负责加密解密等安全处理的模块,所以HTTPS的核心在SSL/TLS上面。整个通信如下:

1. 客户端向一个需要https访问的网站发起请求。

2. 服务器将证书发送给客户端进行校验。证书里面包含了其公钥。这里要特别说一下客户端到底 如何来校验对方发过来的数字证书是否有效。

???????? 首先在本地电脑寻找是否有这个服务器证书上的ca机构的根证书。如果有继续下一步,如果没有弹出警告。

???????? 使用ca机构根证书的公钥对服务器证书的指纹和指纹算法进行解密。

???????? 得到指纹算法之后,拿着这个指纹算法对服务器证书的摘要进行计算得到指纹。

???????? 将计算出的指纹和从服务器证书中解密出的指纹对比看是否一样如果一样则通过认证。

3. 校验成功之后,客户端会生成一个随机串然后使用服务器证书的公钥进行加密之后发送给服务器。

4. 服务器通过使用自己的私钥解密得到这个随机值。

5. 服务器从此开始使用这个随机值进行对称加密开始和客户端进行通信。

6. 客户端拿到值用对称加密方式 使用随机值进行解密。

Https与Http的区别:

???????? Http协议运行在TCP之上,用来在 Internet 上传送超文本的传送协议,它可以使浏览器更加高效,使网络传输减少。但 HTTP 协议采用明文传输信息,客户端与服务器端都无法验证对方的身份,存在信息窃听、信息篡改和信息劫持的风险。;

???????? Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。二者之间存在如下不同:

端口不同:Http与Https使用不同的连接方式,。用的端口也不一样,前者是80,后者是443

资源消耗:和Http通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;

开销:Https通信需要到CA机构申请SSL证书,而证书一般需要向认证机构购买;

安全性:Http无状态传输,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议(HTTPS=HTTP+加密+认证+完整性保护),要比Http协议安全。

传输方式:Http明文传输,Https是密文传输。

HTTPS数据传输流程:

1.浏览器将支持的加密算法信息发送给服务器

2.服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器

3.浏览器验证证书合法性,并结合证书公钥加密信息发送给服务器

4.服务器使用私钥解密信息,验证哈希,加密响应消息回发浏览器

5.浏览器解密响应消息,并对消息进行验证,之后进行加密交互数据

Https真的很安全嘛?不一定

???????? 浏览器默认填充http://,https->http请求需要进行跳转,有被劫持的风险 

可以使用HSTS(HTTP Strict Transport Security)优化

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 13:06:15  更:2021-07-30 13:07:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 7:41:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码