网络总结

  • 一、OSI七层模型
  • 二、TCP/IP五层模型
  • 1.数据封装与分用
  • 2.网络基础
  • IP地址
  • 早期固定分类的方式
  • 动态划分的方式:子网掩码
  • MAC地址
  • 网络设备
  • 3. 网络数据传输
  • 三、重要协议
  • 0.数据链路层重点协议
  • 以太网
  • MTU(Maximum Transmission Unit)
  • 1.网际层协议与技术
  • IP(Internet Protocol)
  • ARP(Address Resolution Protocol)
  • RARP(Reverse Address Protocol)
  • ICMP(Internet Control Message Protocol)
  • NAT(NetWork Address Translator)
  • 2.传输层协议与技术
  • TCP(Transmission Control Prortocol)
  • UDP(User Datagram Protocol)
  • UDP怎么实现可靠传输(UDP大小受限制怎么传输超过64kb的数据)?
  • TCP VS UDP
  • 3.应用层协议
  • DNS(Domain Name System)
  • HTTP(HyperText Transfer Protocol)
  • 1.理解
  • 2.HTTP协议格式
  • 3.HTTP协议特点
  • HTTPS
  • 总结
  • 在浏览器地址栏中输入一个URL都发生了什么?
  • 一、应用层角度
  • 二、传输层角度(TCP)
  • 三、网际层角度(广域网数据传输流程)


简介:
  本篇博客是对于网络相关重点知识的总结。包括网络基础知识、TCP/IP基础知识、IP协议、TCP与UDP、HTTP、HTTPS的相关知识。


网络协议分层的好处:解耦合。定义好两层间的接口规范,让双方遵循,不需要关心另一方如何具体实现。

一、OSI七层模型

OSI:Open System Interconnection 开放互联系统

OSI参考模型

功能

7.应用层

针对特定应用的协议,负责应用程序间的沟通

6. 表示层

设备固有数据转换格式和网络标准数据格式的转换

5.会话层

通信管理。负责建立和断开通信连接。管理传输层一下分层

4.传输层

管理两个节点(网络终端)之间的数据传输。负责数据可靠传输

3.网络层

(IP地址的封装与解封装 )地址管理与路由选择。

2.数据链路层

(MAC地址的封装与解封装)互联设备之间传送和识别数据帧

1.物理层

传输比特流,定义物理设备标准

补充:

  1. 物理层:该层数据叫做比特;
  2. 数据链路层:该层叫做帧,工作设备是交换机,数据通过交换机来传输。
  3. 网络层:该层数据就做数据包,工作设备是路由器。
  4. 传输层:主要是将从上层接收的数据进行分段传输,到达目的地进行重组。该层数据叫做段。

实际组建网络只是以OSI七层模型设计部分即TCP/IP五层模型来实现。


二、TCP/IP五层模型

Java网络启动协议文件 java 网络_java

Java网络启动协议文件 java 网络_Java网络启动协议文件_02


1.数据封装与分用


应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部,称为封装

数据封装的过程

Java网络启动协议文件 java 网络_Java网络启动协议文件_03


数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的“上层协议字段”将数据交给对应的上层协议处理,称为分用数据分用的过程

Java网络启动协议文件 java 网络_java_04


2.网络基础


IP地址

作用:IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
格式:IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(4个字节。通常用“点分十进制”的方式来表示,即 a.b.c.d 的形式.
版本:IPv4(32位)(广泛使用)和IPv6(128位)。
组成网络号 + 主机号
网络号:标识网段; 主机号:标识主机;

早期固定分类的方式

所有IP 地址分为五类:

Java网络启动协议文件 java 网络_IP_05

特殊的IP地址:

  1. IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;
  2. IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
  3. 127.*的IP地址用于本机环回(loop back 本机环回主要用于本机到本机的网络通信)测试,通常是127.0.0.1(A类中减去一个网络数量);
    各类地址表示的范围:

分类

范围

适用网络

网络数量

主机最大连接数

A类

0.0.0.0~127.255.255.255

大型网络

126(2^7 - 1 - 1)

2^24 - 2

B类

128.0.0.0~191.255.255.255

中等规模网络

2^14 - 1

2^16 - 2

C类

192.0.0.0~223.225.225.225

小型网络

2^21 - 1

2^8 - 2

D类

224.0.0.0~239.255.255.255

E类

240.0.0.0~247.255.255.255

动态划分的方式:子网掩码

上述分类地址的方案中存在IP地址浪费的问题,引入子网掩码来进行子网划分。

格式:子网掩码格式和IP地址一样,也是一个32位的二进制数。其中左边是网络位,用二进制数字“1”表示,1的数目等于网络位的长度;右边是主机位,用二进制数字“0”表示,0的数目等于主机位的长度。子网掩码也可以使用二进制所有高位1相加的数值来表示,如以上子网掩码也可以表示为24。
计算方式:
网络号 + 子网号:将 IP 地址和子网掩码进行“按位与”操作,得到的结果就是网络号 + 子网号。
主机号:将子网掩码二进制按位取反,再与 IP 地址位与计算,得到的就是主机号。

之后IP地址的组成为:网络号 + 子网号 + 主机号,网络号和子网号统一为网络标识

MAC地址

**作用:**用于标识网络设备的硬件物理地址。

  • 主机具有一个或多个网卡,路由器具有两个或两个以上网卡;其中每个网卡都有唯一的MAC地址;
  • 网络通信:网络数据传输本质上是网络硬件设备将数据发送到网卡上或从网卡接收数据;
  • 硬件层面,只能基于MAC地址识别网络设备的网络物理地址;
    **表示:**长度为48位,及6个字节。一般用16进制数字加上冒号的形式来表示(例如:
    08:00:27:03:fb:19)
    **特殊的MAC地址:**广播数据报:发送一个广播数据报,表示对同网段的所有主机发送数据报。MAC地址为:FF:FF:FF:FF:FF:FF.

IP地址表述的是路途总体的起点和终点,是给人使用的网络逻辑地址;
MAC地址表述的是路途上每一个区间的起点和终点即每一跳的起点和终点是给网络硬件设备使用的网络物理地址;

网络设备

  1. **集线器:**工作在物理层的网络设备,发送到集线器的任何数据,都只是简单的将数据赋值并转发到其他所有端口(物理端口)。
  2. 交换机: MAC地址转换表 + 转发对应端口。MAC地址转换表主要记录MAC地址与其后物理端口之间的映射。
  3. **主机:**根据网络分层从上到下封装。
  4. 主机&路由器: ARP缓存表 + ARP寻址
  5. **路由器:**路由 + NAPT。
    路由控制表:所有主机都维护这一张路由控制表,记录IP数据下一步应该发给哪个路由器。
    路由器的作用:
  6. 网关:划分公网和局域网,某些路由器还可以将局域网划分为多个子网(不同网段)。
  7. 路由:路由是指在复杂的网络结构中,规划路线以寻找一条通往终点的线路。

3. 网络数据传输


局域网传输流程:集线器
涉及到封装、集线器转发和ARP寻址。
  ①源主机,发送HTTP请求到目的主机

  ②从上到下封装数据报:
    应用层:HTTP协议首部
    传输层:TCP协议首部(源端口、目的端口)
    网络层:IP协议首部(源IP、目的IP)
    数据链路层:以太网帧(源MAC、目的MAC)

  ③ARP寻址:寻找下一跳设备的MAC地址
    (1)主机和路由器中都保存了一张ARP缓存表:通过IP地址可以找到对应的MAC地址。
    (2)根据下一跳设备的IP地址,在ARP缓存表中能找到对应的MAC地址,则可以设置目MAC并发送数据报。

      ④找到目的MAC,发送数据
      ⑤转发数据:通过集线器转发到所有端口连接的设备
      ⑥接收数据报:目的主机看IP、MAC是否符合自己,符合则接收,否则丢弃
      ⑦从下到上分用:
        数据链路层:目的MAC符合,接收
        网络层:目的IP符合,处理
        传输层:根据端口找到对应进程
        应用层:把数据交给应用层,由应用程序根据应用层协议解析
      ⑧返回响应数据:和请求流程一样,只是源IP和目的IP交换,源端口和目的端口交换
    (3)如果找不到,则发送ARP广播数据报:目的MAC为广播地址,询问下一跳设备的MAC地址。
      ④找不到目的IP,目的MAC设置为FF:FF:FF:FF:FF:FF:FF,发送广播数据报
      ⑤集线器转发数据
      ⑥接收广播数据报:目的主机判断IP是否相同,相同返回自己的MAC地址给源主机,否则丢弃
      ⑦响应

局域网传输流程:交换机
涉及到:交换机MAC地址转换表
  ①源主机,发送HTTP请求到目的主机

  ②从上到下封装数据报:
    应用层:HTTP协议首部
    传输层:TCP协议首部(源端口、目的端口)
    网络层:IP协议首部(源IP、目的IP)
    数据链路层:以太网帧(源MAC、目的MAC)

  ③ARP寻址:寻找下一跳设备的MAC地址
    (1)主机和路由器中都保存了一张ARP缓存表:通过IP地址可以找到对应的MAC地址。
    (2)根据下一跳设备的IP地址,在ARP缓存表中能找到对应的MAC地址,则可以设置目MAC并发送数据报。

    (3)如果找不到,则发送ARP广播数据报:目的MAC为广播地址,询问下一跳设备的MAC地址。

  ④找到目的MAC,发送数据

  ⑤1.读取数据,可以知道源MAC的主机是连接哪个端口
   2.通过目的MAC查找对应的端口
   3.如果找到,直接将数据报转发到对应的端口
   4.否则,将数据广播到所有端口,目的主机返回响应,即可记录目的主机MAC与端口

   ⑥接收数据报:目的主机看IP、MAC是否符合自己,符合则接收,否则丢弃

   ⑦从下到上分用:
        数据链路层:目的MAC符合,接收
        网络层:目的IP符合,处理
        传输层:根据端口找到对应进程
        应用层:把数据交给应用层,由应用程序根据应用层协议解析

   ⑧返回响应数据:和请求流程一样,只是源IP和目的IP交换,源端口和目的端口交换

局域网传输流程:交换机 + 路由器
涉及到:子网掩码、网关
  ①源主机,发送HTTP请求到目的主机

  ②从上到下封装数据报。

  ③检查目的主机是否和本机是同一网段:
    (1)通过IP与本机子网掩码位做与运算,可以得到目的主机的网段(网络号)以及本机的网络号;
    (2)判断目的主机和本机是否同网段,若是则与局域网交换机交换机流程相同
  ④本机无法处理跨网段的数据报,交给网关处理:
    (1)找到本机相连的网关设备IP,也就是路由器的IP
    (2)ARP寻址,根据网关IP查找对应的MAC地址
  ④发送数据报到网关设备(目的MAC为路由器的MAC)
  ⑤交换机,根据目的MAC找到对应的端口。
  ⑥转发数据报到网关(路由器)
  ⑦路由器解析数据报:
    (1)从下到上分用
    (2)ARP寻址,找到目的IP对应的MAC
    (3)封装数据报并发送到目的主机
      修改内容:源MAC:路由器的MAC
          目的MAC:目的主机的MAC 或者 另一个路由器的MAC
  ⑧进入到目的主机所在的局域网
  后序流程与上述过程相同

广域网数据传输流程在关于“浏览器地址栏中键入一个URL都发生了什么”的问题中具体说明。


三、重要协议


0.数据链路层重点协议

以太网

以太网帧格式

Java网络启动协议文件 java 网络_网络协议_06

目的地址:指的是MAC地址

源地址:MAC地址,填本地MAC地址

类型:指该数据要交给那个上层协议。有IP、ARP、RARP。

数据:要传输的数据,该数据有长度要求,在46~1500字节之间。

帧末尾是CRC校验码。

MTU(Maximum Transmission Unit)

最大传输单元,指从发送端主机到接收端主机之间 不需要分片 时最大MTU的大小,即路径中存在的所有数据链路中最小的MTU。
 以太网帧中的数据程度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位。
最大值1500字节成为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
 如果一个数据包从以太网路由拨号到链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片。
 不同数据链路标准的MTU是不同的。

MTU对IP的影响
 由于数据链路层MTU的限制,对于较大的IP数据包要进行分片与重组。
  将较大的IP包分为多个小包,并给每个小包打上标签。
  每个小包IP协议头的16位标识都是相同。
  每个小包的IP协议头的 3位标志字段 中,第2位设置为0,表示允许分片,第3位置为1表示当前是最后一个小包,为0 表示不是最后一个,第3位表示结束标记。
  到达对端时再将这些小包,按照顺序重组,拼装到一起返回给传输层。
  一旦任意小包丢失,接收端的重组会失败,但IP层不会负责重新传输数据。

MTU对UDP的影响
 一旦UDP携带的数据查过1500-20(IP首部)-8(UDP首部)= 1472,那么就会在网络层分成多个IP数据报。
 UDP数据在网路层被分片后,有任意丢失,都会引起接收端网络层重组失败,整个数据被丢失的概率就大大增加了。

MTU对TCP的影响
 TCP的一个数据段也不可能无限大,要受制于MTU。TCP的单个数据段的最大消息长度,称为MSS(Max Segment Size)
 TCP在建立连接的过程中,通信双方会进行 MSS协商。
 最理想情况下,MSS的值签好是在IP不会被分片处理的最大长度(受制于MTU)。
 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。
 然后双方的值对方的MSS值后,选择较小的作为最终MSS。
 MSS的值就是TCP首部的40字节变长选项中的。

1.网际层协议与技术


IP(Internet Protocol)

IP大致分为三大作用模块:IP寻址、路由以及IP分片与重组。
IP分割处理与再构成处理
1.数据链路不同,MTU则相异

2.IP报文的的分片与重组:
 分片往往在网络上遇到比较大的报文无法一下子发送出去才会进行处理。
 经过分片之后的IP数据报在被重组的时候,只能由目标主机 进行。路由器虽然做分片但不会进行重组。
 IP首部中的“片偏移”字段表示分片之后每个分片在用户数据中的相对位置和该分片之后是否还有后续其他分片;根据这个字段可以判断一个IP数据报是否分片以及当前分片为整个数据报的起始、中段还是末尾;

3.路径MTU发现
路径MUT:指从发送端主机到接收端主机之间不需要分片时最大MTU的大小,即路径中存在的所有数据链路中最小的MTU。
UDP情况下:
 ①发送时IP首部的分片标志位设置为不分片。路由器丢包。
 ②由ICMP通知下一次MTU的大小。
 ③UDP中没有重发处理。应用在发送下一个消息时会被分片,UDP层传过来的“UDP首部+UDP数据”在IP层被分片。
 所有的分片到达目标主机后被重组,再传给UDP层。
TCP情况下:
 ①发送时IP首部的分片标志位设置为不分片。路由器丢包。
 ②有ICMP通知下一次MTU的大小
 ③根据TCP的重发处理,数据报会被重新发送。TCP负责将数据分成IP层不会再被分片的粒度后传给IP层,IP层不再左分片处理。
 ④不需要重组。数据原样发送给接收端主机的TCP层。
版本: IPv4、IPv6
IPv6:
 必要性:为了根本解决IPv4地址耗尽的问题而被标准化的网际协议;

 特点: IP地址的扩大与路由控制表的聚合、性能提升、支持即插即用功能、采用认证与加密功能、多播,Mobile IP成为扩展功能。

 格式:将128比特IP地址以每16比特位为一组,每组":"隔开。

IPv4:

协议头格式:

Java网络启动协议文件 java 网络_Java网络启动协议文件_07



ARP(Address Resolution Protocol)

是介于网际层和数据链路层之间的协议。
作用:是解决地址问题的协议。以目标IP地址为线索,用来定位下一个应该接收数据分包的网络设备对应的MAC地址,实现链路内IP通信。

ARP的工作机制:
  ARP借助ARP请求与ARP响应两种类型的包确定MAC地址。
  ①主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包,其中包含主机B的IP地址。
  ②由于广播的包可以被同一个链路上所有的主机或路由器接收,因此ARP的请求包就会被这同一链路上的所有主机和路由器进行解析。
  ③如果ARP请求包中目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址塞入ARP响应包返回给主机A。

IP地址和MAC地址缺一不可


RARP(Reverse Address Protocol)

**作用:**是将ARP反过来,从MAC地址定位IP地址的一种协议。




ICMP(Internet Control Message Protocol)

作用: 确定IP包是否成功送达目标地址、通知在发sing过程当中IP包被废弃的具体原因、改善网络设置等。用于辅助IP确认网络是否正常工作,以及遇到异常时进行问题诊断。

ICMP的消息:
  大致可以分为两类:通知出错原因的错误消息、用于诊断的查询消息
    ICMP目标不可达消息
    ICMP重定向消息
    ICMP超时消息
    ICMP回送消息




NAT(NetWork Address Translator)

作用:用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术。可以转换TCP,UDP端口号的NAPT(NetWork Address Ports Translator)技术,由此可以实现用一个全局IP地址与多个主机的通信。

NAT的工作机制:
  在NAT(NAPT)路由器内部,有一张自动生成的用来转换地址的表。
  利用NAT路由器将发送源地址转换为全局的IP地址再发送数据。反之,当包从目的地址发送富哦来时,目的地之先被转换成私有IP地址以后再被转发。

NAT的潜在问题:
  无法从NAT外部向内部服务器建立连接。
  转换表的生成与转换操作都会产生一定的开销。
  ……
解决:1.改用IPv6 2.NAT穿越


2.传输层协议与技术

IP首部中有一个协议字段,用来标识网络层的上一层所采用的的是哪一种传输层协议。
TCP提供可靠的通信传输,UDP长被用于让广播和细节控制交给应用的通信传输。


TCP(Transmission Control Prortocol)

作用: 在不可靠的互联网络上提供可靠的端到端字节流,对数据的传输进行详细控制。

TCP协议段格式

Java网络启动协议文件 java 网络_网络协议_08

6位标志位:

 URG:紧急指针是否有效

 ACK:确认号是否有效

 PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走

 RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段

 SYN:请求建立连接;我们把携带SYN标识的称为同步报文段

 FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

TCP是如何保证可靠传输的?

1.应用数据被分割成 TCP 认为最适合发送的数据块。
2.TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
3.校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
4.TCP 的接收端会丢弃重复的数据。
5.TCP对数据传输的管控主要体现在 安全机制 和 效率机制 两个方面。安全机制有确认应答、超时重传、连接管理、流量控制和拥塞控制。效率机制有滑动窗口、延迟应答和捎带应答。
6.ARQ协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。

TCP对数据传输的管控主要体现在 安全机制 和 效率机制 两个方面。

安全机制:

1.确认应答机制

Java网络启动协议文件 java 网络_IP_09


标志位ACK置为1,则代表确认号有效。

 TCP将每个字节的数据都进行了编号,即序列号。每一个ACK都带有对应的确认序列号,表示下一次希望接收的数据的起始序列号。

2.超时重传机制
(1)主机A发送数据给主机B之后,可能因为网络拥堵等原因,数据无法到达主机B。
 如果主机A在一个特定时间间隔内没有收到B发送来的确认应答,就会进行重发。

(2)主机B确认应答后,ACK中途丢失了,主机A未收到确认应答。
 主机B收到很多重复数据,利用序列号去重。

机制:TCP动态计算最大超时时间,以保证在任何环境下都能较高效率的通信。
 1.超时时间以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。
 2.如果重发一次之后仍然得不到应答,等待 2 * 500ms 之后再进行重传。
 3.如果过仍然得不到应答,等待 4 * 500 ms 进行重传。
 4.以此类推,以指数形式递增。累积到一定重传次数,TCP认为网络出现异常,强制关闭连接。

3.连接管理机制

Java网络启动协议文件 java 网络_Java网络启动协议文件_10


3.1三次握手建立连接

 1.开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态

 2客户端会随机初始化序号( client_isn ),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。

 3.服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号( server_isn ),将此序号填入TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1 , 接着把 SYN和 ACK 标志位置为 1 。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。

 4.客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。

 5.服务器收到客户端的应答报文后,也进入 ESTABLISHED 状态。

为什么要三次握手建立连接?
①为什么不是两次?
1.防止已经过期的连接请求报文突然又传送到服务器,因而产生错误、浪费资源。
  在双方两次握手就能建立连接的情况下,假设客户端发送请求(1)建立连接,由于网络原因才造成请求暂时无法到达服务器。
  客户端在长时间得不到应答的情况下重新发送请求(2),本次双方顺利建立连接并传输数据,最后断开连接。
  这之后请求(1)才到达服务器,服务器立即返回确认报文并进入ESTABLSHED状态,但是已经进入COLSED状态的客户端无法再接收并确认,无法建立连接。导致服务器长时间单方面等待,造成资源浪费。
2.三次握手才能让双方均确认自己和对方的发送和接收能力都正常。
  第一次握手,服务端可以确认自己的接收能力和对方的发送能力正常。
  第二次握手,客户端可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常。
  第三次握手:服务端可以确认自己发送能力和接收能力正常,对方发送能力和接收能力正常。
3.告知对方自己的初始序列号,并确认对方的初始序列号。
  序列号与确认序列号是TCP实现可靠传输的原因之一。如果只是两次握手,只有客户端的初始序号可以得到确认,而服务端的初始序列号得不到确认。

②为什么不是四次?
 三次握手已经可以确认双方的发送接收能力正常,完成对双方初始序列号的确认,三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

3.2四次挥手断开连接
 1.客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进 FIN_WAIT_1 状态。
 2.服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入CLOSED_WAIT 状态。(被动关闭连接的,才有CLOSED_WAIT状态)
 3.客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
 4.等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
 5.客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入TIME_WAIT 状态。(主动关闭连接的,才有 TIME_WAIT 状态)。
 6.服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭。
 7.客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭。

为什么要四次挥手断开连接?
 1.TCP连接是全双工的,每个方向必须单独关闭。
 2.第一次挥手之后,客户端发送了最后的数据,但服务端可能还有未发送的数据给客户端,客户端还需有接收的能力,所以第二次挥手服务端发送ACK应答给客户端,客户端还需要等待。
 3.当服务端处理完数据后,第三次挥手向客户端发送FIN,客户端确认应答后服务端即满足了关闭的条件。

综上,也就是四次挥手是为了达到拆除两条通信信道和释放资源,保证数据传输完,双方都达到关闭连接的条件才关闭连接。

为什么 TIME_WAIT 等待的时间是 2MSL?
MSL是Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为TCP报文基于是IP协议的,而IP头中有一个TTL字段,是IP数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。

MSL与TTL的区别:MSL的单位是时间,而TTL是经过路由跳数。所以MSL应该要大于等于TTL消耗为0的时间,以确保报文已被自然消亡。
TIME_WAIT等待2倍的MSL,比较合理的解释是︰网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待⒉倍的时间。
 比如如果被动关闭方没有收到断开连接的最后的ACK报文,就会触发超时重发Fin报文,另一方接收到FIN后,会重发ACK给被动关闭方,一来一去正好2个MSL。
2MSL 的时间是从客户端接收到FIN后发送ACK开始计时的。如果在TIME-WAIT时间内,因为客户端的ACK没有传输到服务端,客户端又接收到了服务端重发的FIN报文,那么2MSL时间将重新计时。
 在Linux系统里2MSL默认是60秒,那么一个MSL也就是30秒。Linux系统停留在TIME_WAIT的时间为固定的60秒。

为什么需要 TIME_WAIT 状态?
 1.防止具有相同四元组旧数据包被收到;
 2.保证被动关闭连接的一方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭;

TIME_WAIT 过多有什么危害?
 1.内存资源占用。从服务器来讲,短时间内关闭了大量的Client连接,就会造成服务器上出现大量的TIME_WAIT连接,严重消耗着服务器的资源,此时部分客户端就会显示连接不上。
 2.对端口资源的占用,一个 TCP 连接⾄少消耗⼀个本地端口;从客户端来讲,客户端TIME_WAIT过多,就会导致端口资源被占用,因为端口就65536个,被占满就会导致无法创建新的连接。
解决方法:1.服务器设置SO_REUSEADDR 套接字选项来避免 TIME_WAIT状态。
  2.调整系统内核参数
  3.强制关闭,发送 RST 包越过TIME_WAIT状态,直接进入CLOSED状态。

close_wait大量出现的原因和解决方案
 原因:状态一直停留在close_wait状态,而没有发送FIN信号并迁移到LAST_ACK状态,一般都是在收到主动关闭发起方的FIN信号后没有调用进程的close方法导致状态不迁移
 解决方法:1、当收到客户端关闭连接之后,主动关闭进程 2、设置keepAlive参数。

4.流量控制
 流量控制机制:TCP支持根据接收端的处理能力,来决定发送端的 发送速度 。

解决的问题:接收端处理数据的速度是有限的。如果发送端发送太快,导致接收端缓冲区被打满,如果继续发送就会造成丢包,继而引起丢包重传等等一系列连锁反应。

Java网络启动协议文件 java 网络_Java网络启动协议文件_11


 接收端将自己可以接收的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK给发送端。

 接收端一旦发现自己的缓冲区快满了,就将“窗口大小”设置成一个 更小 的值通知给发送端。

 发送端接收到这个ACK后,就会减慢自己的发送速度。

 如果接收缓冲区满了,就会将“窗口大小”设置为0,发送端不在发送数据。

 接收端在TCP首部的“选项”字段中设置 窗口扩大因子M(实际窗口的大小是“窗口大小” << M),给发送端发送窗口更新通知。

 窗口更新通知可能在传输图中丢失

 因此定期的,过了重发超时的时间发送端还没有接收到窗口更新通知,发送端会发送一个窗口探测的包,获取接收端窗口大小。

5.拥塞控制
TCP使用了四种算法实现拥塞控制:慢开始、拥塞避免、快速重传、快速恢复;

拥塞窗口:

 发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。

 发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。

Java网络启动协议文件 java 网络_IP_12


1.慢开始:

解决的问题:计算机网络处在一个共享的环境,可能会因为其他主机的通信使得网路拥堵,当网络拥堵时,突然发送一个较大量的数据极有可能导致整个网络瘫痪。有效地减少通信开始时连续发包导致的网络拥堵,可以避免网络拥塞情况的发生。

Java网络启动协议文件 java 网络_Java网络启动协议文件_13


慢启动机制:

 最初将发送端的拥塞窗口大小设置为1个数据段(1MSS 最大报文段)。(慢启动)

 每收到一个确认应答,把拥塞窗口大小翻倍,呈现指数式的增长(快增长)。

 每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小做比较,取较小的值作为实际发送的窗口;

 拥塞窗口指数式的增长,拥堵状况激增甚至导致网络拥塞的发生。因此需要拥塞避免

2.拥塞避免:

 拥塞窗口大小指数式增长直到拥塞窗口的值超出慢启动阈值(ssthresh),在每次收到确认应答时只允许以{(1个数据段的字节数 / 拥塞窗口(字节))* 1个数据段字节数 }这种比例放大拥塞窗口。此后拥塞窗口的大小呈现直线(加法增大)上升的趋势。

(TCP通信开始时,并没有设置相应的慢启动阈值,慢启动阈值等于拥塞窗口最大值。而是在超时重发时才会设置为当时拥塞窗口大小的一半)

 当发生超时重发时,设置慢启动阈值为当前拥塞窗口大小的一半,拥塞窗口设置为1。重新开始慢开始。

3.快速重传:

Java网络启动协议文件 java 网络_java_14


 发生超时,由重复确认应答(收到至少3次的确认应答数据段,说明网络拥堵较轻,发送方立即重传对方希望的收到的报文段)触发 高速重发机制。慢启动阈值大小设置为当时拥塞窗口大小的一半。拥塞窗口大小设置为该慢启动阈值 + 3个数据段的大小。

4.快速恢复:
 主要是为了配合快重传。当发送方连续收到三个重复确认时,就执行“乘法减小”算法,慢启动阈值大小设置为当时拥塞窗口大小的一半。拥塞窗口大小设置为该慢启动阈值 + 3个数据段的大小。



效率机制:
1.滑动窗口
解决的问题:在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。TCP 协议需要对数据进行确认后,才可以发送下一个数据包。这样一来,就会在等待确认应答包环节浪费时间。

窗口的大小:指不需要等待确认应答包而可以继续发送数据包的最大值。

Java网络启动协议文件 java 网络_网络_15

 滑动窗口左边的是已经发送并被确认的分组,右边是还没有轮到的分组

 滑动窗口内被分为两块,一块是已经发送但还未被确认的分组,另一块是窗口内等待发送的分组。

 操作系统内核为了维护这个滑动窗口,需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答;只有确认应答过的数据,才能从缓冲区删掉;随着已经发送的分组不断被确认,窗口内等待的分组也会不断被发送。整个窗口就会往右移动,让还未轮到的分组进入窗口内。

 滑动窗口的大小决定了当前TCP发送包的速率,窗口越大网络的吞吐率就越高。滑动窗口的大小取决于拥塞控制窗口和流量控制窗口的两者间的较小值。

1.1窗口机制下,如果出现了丢包,如何进行重传?

1.丢包情况1:数据报已经抵达服务端,但服务端返回的ACK丢失了

Java网络启动协议文件 java 网络_IP_16


 这种情况下部分ACK丢失不要紧,可以通过后序的ACK进行确认。2.丢包情况2:客户端发送的数据报直接丢失

Java网络启动协议文件 java 网络_Java网络启动协议文件_17

 当某一段报文段丢失后,发送端会一直收到丢失的数据包对应的那一起始序列号(图中对应1001)的ACK。
 如果发送端主机连续三次收到了同一个序列号(1001)的应答,就会将对应的数据(1001~2000)重新发送。
 接收端收到了想要的数据后,返回下一个ACK(图中对应7001,2001~7001接收端已经接收到了,被放到了接收端操作系统内核的接收缓冲区)

2.延迟应答
 如果接收方立即返回ACK应答,返回的窗口可能比较小,为了在保证网络不拥塞的情况下尽量提高传输效率,接收方稍微等待一会,处理掉一部分数据,返回更大的窗口大小。
 由于数量限制(每隔N个包就要应答一次)和时间限制(超过最大延迟时间就要应答一次),所以并不是所有的包都可以延迟应答。

3.捎带应答
 捎带应答就类似于搭顺风车,比如在三次握手中从第二次握手就可以捎带数据给对方。

特点:
  1.面向连接:应用程序在使用TCP协议之前必须建立TCP连接,在传输数据完毕之后,必须释放已经建立的TCP连接
  2.TCO连接只能是点对点(一对一)的
  3.TCP提供可靠交付的服务:通过TCP连接传送的数据无差错、不丢失、不重复、并且按序到达。
  4.TCP提供全双工通信:TCP允许通信双方的应用进程在任何时候都可以发送数据。
  5.缓冲区:TCP连接的两端都舍友发送缓冲区和接收缓冲区,用来临时存放双向通信的数据。
  6.面向字节流


UDP(User Datagram Protocol)

作用: UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。

UDP协议段格式:

Java网络启动协议文件 java 网络_Java网络启动协议文件_18


UDP的特点:

  1.无连接:直到目的主机的IP和端口号就直接进行传输,不需要建立连接

  2.不可靠:没有任何安全机制

  3.面向数据报:应用层交给UDP多长的数据报,UDP不拆分、不合并原样发送

  4.缓冲区:UDP只有接收缓冲区,没有发送缓冲区

  5.UDP 支持一对一、一对多、多对一和多对多的交互通信

  6.UDP提供全双工通信

  7.大小受限:UDP 的首部开销小,只有8个字节,比 TCP 的20个字节的首部要短



基于UDP的应用层协议:

  NFS(网络文件系统)、TFTP(简单文件传输协议)、DHCP(动态主机配置协议)、BOOTP(启动协议,用于无盘设备启动)、DNS(域名解析协议)

UDP怎么实现可靠传输(UDP大小受限制怎么传输超过64kb的数据)?

答:实现的方式可以参照TCP可靠性传输的方式,将实现转移到应用层,在UDP协议协议上构建自己的协议。
  1.引入序列号,保证数据顺序
  2.引入确认应答机制,确保对端受到了数据
  3.引入超时重传机制,如果隔一段时间没有应答就重发数据
  4.添加发送和接收缓冲区
  5.引入拥塞控制

已有基于UDP协议实现的可靠性传输协议
增强版本:RUDP、RTP、UDT
  QUIC协议,解决了TCP队头阻塞问题,并对TCP的拥塞控制,可以更快建立连接。


TCP VS UDP

UDP

TCP

是否连接

无连接

面向连接

是否可靠

不可靠传输

可靠传输,使用确认应答、超时重传、连接管理、流量控制、拥塞控制、滑动窗口、延迟应答和捎带应答

是否有序

无序

有序,TCP会依据序列号进行重排序

传输速度



连接对象个数

支持一对一,一对多,多对一和多对多交互通信

只支持一对一通信

传输方式

面向报文

面向字节流

首部开销

首部开销小,仅8字节

首部开销最小20字节,最大60字节

适用场景

适用于那些对高速传输和实时性有较高要求的通信或广播通信(比如IP电话、视频会议、直播)

适用于在传输层有必要实现可靠传输的情况(比如邮件传输)


3.应用层协议


DNS(Domain Name System)

作用:将访问网站是的一串罗马字和点号组成的字符串自动转换为具体的IP地址。DNS系统可以有效管理主机名与IP地址之间的对应关系。

域名:指为了识别主机名称和组织机构名称的一种具有分层的名称。

DNS查询机制:
 计算机要访问指定网站
  1.解析器向DNS服务器查询IP地址。

  2.浏览器搜索 自己的DNS缓存 (维护一张域名与IP的对应表);若没有,则搜索 操作系统的DNS缓存 (维护一张域名与IP的对应表);若没有,则搜索操作系统的 hosts文件(维护一张域名与IP的对应表)。若都没有,则找 tcp/ip 参数中设置的 首选 dns 服务器,即本地 dns 服务器(递归查询),本地域名服务器查询自己的dns缓存,如果没有,则进行迭代查询。将本地dns服务器将IP返回给操作系统,同时缓存IP。

  3.找到了网站的IP地址,将其返回。
  4.开始进行通信


HTTP(HyperText Transfer Protocol)

1.理解

  HTTP是超文本传输协议。
 1.协议:HTTP是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了计算机之间 交流通信的规范(两个以上参与者),以及相关的 各种控制和错误处理 (行为约定和规范)。
 2.传输:HTTP是一个在计算机世界中专门用来 两点之间传输数据 的约定和规范。
 3.超文本:HTTP传输的内容是超文本。超文本本身只是纯文字文件,但内部用很多标签定义图片、视频等的链接,再经过浏览器解释,呈现一个文字、有画面的网页了。
HTTP是一个在计算机世界中专门在 两点之间 传输 文字、图片、音频等 超文本 数据的 约定和规范

这种协议游走在浏览器(Browser)和服务器(Server)之间,双方通信需要遵循HTTP协议,双方才可以实现解耦合。
请求:Browser -> Server 发送数据
响应:Server -> Browser 发送数据

HTTP与IP、TCP和DNS密切相关:
 发送端HTTP协议职责:生成针对目标WEB服务器的HTTP请求报文
 发送端TCP协议职责:为了方便通信,将HTTP请求报文分割成有序的报文段,并可靠地传给对方。
 IP协议职责:搜索对方地址,一遍中转一遍传送
 接收端TCP协议职责:接收到报文段,并重组到达的报文段
 接收端HTTP协议职责:对WEB服务器请求的内容进行处理
 请求的处理结果也同样利用TCP/IP通信协议进行回转

2.HTTP协议格式

HTTP协议包括 请求协议 和 响应协议

Java网络启动协议文件 java 网络_网络协议_19

2.1 请求协议(Request):
1.请求方式(Method):

方式

说明

支持的HTTP协议版本

GET

获取资源

1.0、1.1

POST

传输实体主体

1.0、1.1

PUT

传输文件

1.0、1.1

HEAD

获得报文首部

1.0、1.1

DELETE

删除文件

1.0、1.1

OPTIONS

询问支持的方法

1.1

TRACE

追踪路径

1.1

CONNECT

要求用隧道协议连接代理

1.1

LINK

建立和资源之间的联系

1.0

UNLINE

断开连接关系

1.0

如何发送GET请求?
 1.地址栏中输入URL + 回车
 2.通过一些标签 <img>、<script>、<link>  3.还有一些标签<a>、<from>使用默认method或者另其等于get
 4.ajax,指定open中的method参数为get
 5.重定向(redirect)

如何发送POST请求?
 1.form表单设置method=“post”
 2.ajax,指定open参数method为post
 3.重定向(redirect)

  GET和POST的区别:
 1.语义不同:
  GET方法的语义是 从服务端获取资源。
  POST方法的语义是 向URI指定的资源提交数据。
 2.参数的位置不同:
  GET的body一般为空,使用URL(query string)或者Cookie传参。
  POST的query string一般为空,将参数放在请求体中传参。
3.幂等性不同(本质区别):
 幂等:多次执行相同的操作,结果都相同。
  GET请求一般是幂等的。POST请求一般是不幂等的。
 4.是否可以被缓存不同:
  由于幂等性不同,GET有缓存的必要,POST 没有缓存的必要,所以GET可以被缓存,而POST不可以被缓存。
 注意:安全性:GET和POST是否安全取决于前端在传输敏感信息时是否进行加密,和GET和POST 无关。
  传输数据量:标准中没有规定GET的URL长度,也咩有规定POST的body的长度。传输数据量的多少完全取决于不同浏览器和服务器之间的实现区别。
  传输数据类型:GET的query string 虽然无法直接传输二进制数据,但是可以针对二进制数据进行url encode.

2.URL
URI 和 URL
 URI (Uniform Resource Identifier):统一资源标识符,是由某个协议方案表示的 资源定位标识符。
协议方案是指访问资源所使用的协议类型名称。(http,ftp,mailto,telnet,file等30多种)
 URL(Uniform Resource Locator):统一资源定位符,表示资源在互联网上所处的位置。

 区别:1.URL是URI的子集 2.URL定义了如何访问资源,提供了定位该资源的信息。URI唯一标识资源。

URL格式 以及 哪些部分可省略

Java网络启动协议文件 java 网络_网络协议_20

3.协议版本

 HTTP1.0、HTTP/1.1、HTTP/2、HTTP/3

  

4.请求报头

Host:表示服务器主机的地址和端口

Content-Length:表示body中的数据长度

Content-Type:表示请求的body中的数据格式

  常见选项text/plain、text/html、application/json、multipart/form-data:from、image/jpeg……

Cookie

会话管理Cookie/Session
作用: 用于会话管理。HTTP协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录; Session 和Cookie的主要目的就是为了弥补HTTP的无状态特性。

Session
 Session:客户端请求服务器,服务器会为这次请求开辟一块内存空间,这个对象就是Session对象,存储结构为ConcurrentHashMap。服务器可以利用Session存储客户端在同一个会话期间的一些操作记录。

 Session判断是否是同一会话:服务器第一次创建Session空间时,同时设置了SessionId,并通过响应头的Set-Cookie向客户端发送要求设置Cookie的响应(种Cookie)。客户端收到该响应后在本机设置了相应Cookie信息,过期时间为浏览器回话结束。

Cookie
 作用:回话管理、个性化和追踪(记录和分析用户行为)。

Java网络启动协议文件 java 网络_java_21


总结:

 1.Cookie 是 HTTP协议 相关的,属于Client和Server之间的事情。

  (1)Client的职责:保存好Cookie、在之后的请求中携带Cookie

  (2)Server的职责:种Cookie

  (3)表现在HTTP协议上:

    请求头:Cookie:name1 = value1; name2 = value2…

    响应头:Set-Cookie:name1 = value1; name2 = value2…

 2.Session是纯粹 Server 内部的事情,是为每个回话准备一个独立的 Key-Value 结构(HttpSession 对象 : 专属文件柜), 通过 session-id 来区分。一般,把 session-id 放在 cookie 中,利用 cookie 的机制进行传递。

 3.Servlet代码上 request.getSession(true / false)
    HttpSession getAttribute(name) / setAttribute(name, value) / removeAttribute(name)

 4.Cookie 和 Session 最主要的功能用于做登录状态管理的

Cookie和Session的区别:
 1.作用范围不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。
 2.存取方式的不同,Cookie 只能保存 ASCII,Session 可以存任意数据类型,一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等。
 3.有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭或者 Session 超时都会失效。
 4.隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。
 5.存储大小不同, 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie。

5.请求体
请求体中内容与请求头中的Content-Length和Content-Type密切相关。

2.1 响应协议(Response):
1.常见的状态码

类别

简要原因

常见状态码 + 描述

1xx

Informational(信息状态码)

接收的请求正在处理

2xx

Success(成功状态码)

请求正常处理完毕

200 ok(访问成功)

3xx

Redirection(重定向状态码)

需要进行附加操作以完成请求

301 Moved Permanently(永久重定向)、 302 Move temporarily(临时重定向)

4xx

Client Error(客户端错误状态码)

服务器无法处理请求

404 Not Found(没有找到资源)、403 Forbidden(访问被拒绝)、405 Method Not Fount(服务器不支持该请求方法)

5xx

Server Error(服务端错误状态码)

服务器处理请求出错

500 Internal Server Error(服务器内部错误,代码执行异常)

2.响应报头
响应报头的基本格式与请求报头基本一致。

3.响应体
响应体格式取决于Content-Type.

3.HTTP协议特点

 优点:简单、灵活和易于拓展、应用广泛、跨平台和无状态(好处:服务器不会去记忆HTTP状态,所以不需要额外的资源来记录状态信息,减轻服务器的负担)。

 缺点:无状态(弊端:服务器没有记忆能力,他在完成有管理那行的操作时会非常麻烦)、明文传输、不安全(窃听、伪装、数据篡改,使用HTTPS可以有效防止这些问题)

 通信的加密:HTTP可以通过和 SSL(Secure Socket Layer, 安全套接层) 或者 TLS(Transport Layer Sercurity,安全层传输协议),加密HTTP的通信内容。


HTTPS

HTTPS: 与 SSL/TLS 组合使用的 HTTP 被成为 HTTPS(HTTP Secure,超文本传输安全协议)。 HTTPS = HTTP + 加密 + 认证 + 完整性保护

HTTPS 解决的 HTTP 中存在的窃听风险、篡改风险、冒充风险的安全问题。
解决:
 1.使用 混合加密 的方式。
  混合加密:对称加密 和 非对称加密 结合的加密方式:使用对称加密解决明文传输(防止冒充),对称加密的密钥的传输使用非对称加密(防止窃听和篡改)。
    对称加密:加密和解密的密钥相同,使用一个密钥。(单独使用,无法做到安全的密钥传输)
    非对称加密:加密和解密的密钥不同,使用公钥和私钥。(解决了密钥的安全传输,速度慢)
 2.数据摘要(签名)算法 实现完整性。(生成签名的算法,MD5:定长、分散、不可逆)
    摘要算法能够为数据生成独一无二的指纹,用于校验数据的完整性,解决了篡改的风险。
 3.将服务器公钥放入到 数字证书 。
    借助第三方权威机构 CA(数字证书认证机构)颁发,并将服务器公钥放在数字证书中。通过数字证书的方式保证服务器公钥身份,解冒充风险。

HTTPS如何建立连接?
  HTTPS建立连接的大致流程:
   1.客户端和服务器协商对称加密算法。
   2.客户端随机生成一份密钥(对称密钥)。
   3.客户端使用服务器公钥对这个对称密钥进行加密,并将密文传给服务器。
   4.服务器使用私钥解开,得到对称加密的密钥。
   5.之后使用对称加密的密钥进行对称加密。

 开始加密通信前协商对称加密算法(SSL/TLS握手)的详细过程:
  1.ClientHello
   由客户端向服务器发起加密通信请求(ClientHello),报文中包含:
    (1)客户端支持的SSL/TLS协议版本 。
    (2)加密组件列表(加密算法等)。
  2.SeverHello
   服务器收到客户端请求后,向客户端发出响应(ServerHello)。响应内容有:
    (1)确认SSL/TLS协议版本,如果浏览器不支持,则关闭加密通信。
    (2)确认的加密组件列表。
    (3)服务器的数字证书。
  3.客户端回应
   客户端收到服务器的回应之后首先通过浏览器或者操作系统中的CA公钥,确认服务器的数字证书的真实性。如果证书没有问题,客户端会随机生成一份对称密钥,并使用数字证书的公钥进行加密。向服务器发送的内容有:
    (1)加密后的对称密钥。
    (2)加密通信算法改变通知,表示随后的信息都将使用该对称密钥加密通信。
    (3)客户端握手结束通知,表示客户端的握手阶段结束。同时把之前所有内容的发生的数据做个摘要,供服务端校验。
  4.服务器最后回应
   服务器收到加密的对称密钥后,通过私钥获得对称密钥。向客户端发送最后的信息:
    (1)加密算法改变通知。
    (2)服务器握手接收通知,表示服务器阶段已经结束。同时把之前所有内容发生的数据做个摘要,供客户端校验。

中间人攻击:
 在SeverHello传输往客户端的途中,中间人将报文中的证书获取到,并将其中公钥修改为自己的公钥,再发送到客户端。
 客户端将对称密钥使用中间人的公钥加密后,被中间人使用私钥获取到对称密钥,再使用服务端公钥对其加密并传送至服务端。这样对称密钥就被泄露了。


HTTP 与 HTTPS 的区别:

Java网络启动协议文件 java 网络_Java网络启动协议文件_22

 1.HTTP 信息是明文传输,存在安全风险。HTTPS 解决了 HTTP 不安全的缺陷,是TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,是报文能够加密传输。
 2.HTTP 建立连接相对简单,TCP 三次握手之后便可进行 HTTP 的报文传输,而 HTTPS 不仅要TCP 三次握手,还需要进行 SSL/TCL 的握手过程,才可以进入加密报文传输。
 3.HTTP 的端口号是 80, HTTPS 的端口号是 433。
 4.HTTPS 需要向 CA 申请数字证书,来保证服务器身份可信。

基于TCP的应用层协议:HTTP(超文本传输协议)、HTTPS、FTP(文件传输协议)、SMTP(简单邮件传输协议)、POP3(邮件读取协议)、TELNET(网络电传)、SSH(Secure Shell)

基于UDP的应用层协议:DNS(域名服务)、TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、NTP(网络时间协议)、NFS(网络文件系统)、DHCP、BOOTP(启动协议)

HTTP1.0、HTTP/1.1、HTTP/2、HTTP/3的演变

Java网络启动协议文件 java 网络_Java网络启动协议文件_23

HTTP1.1 相比 HTTP1.0提高了什么性能

 1.长链接:使用TCP长连接的方式改善了HTTP1.0短连接造成的性能开销。

 2.管道网络传输:支持管道网络传输,只要第一个请求发送出去,不必等其回来,就可以发送第二个请求,可以减少整体的响应时间。

  HTTP1.1的性能瓶颈:

   1.请求、响应头部未经压缩就发送,首部信息越多,延迟越大。只能压缩Body部分。

   2.发送冗长的首部。每次互相发送相同的首部造成浪费。

   3.队头阻塞:服务器按请求顺序响应的,如果服务器响应慢,会导致客户端一直请求不到数据。

   4.没有请求优先级控制。

   5.请求只能从客户端开始,服务器只能被动响应。

HTTP2相比于HTTP1.1优化了什么

HTTP2基于HTTPS,所以HTTP2的安全性有保障

 1.头部压缩:HTTP2会压缩头,如果同时发出多个请求,他们的头是一样的或相似的,那么协议会帮你消除重复的部分。

  HPACK算法:在客户端和服务端同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后不发送同样字段了,只发送索引号,就可以提高速度。

 2.二进制格式:HTTP2不在像HTTP1.1里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,统称为帧:头信息帧和数据帧。增加了数据传输的效率。

 3.数据流:HTTP2的数据包不是按顺序发送的,同一个连接里面连续的数据包,可能数据不同的回应。因此,必须对数据包做标记,指出它属于哪个回应。
  每个请求获回应的所有数据包,称为一个数据流。每个数据流都标记着独一无二的编号,客户端发出的数据流编号为奇数,服务器发出的编号为偶数。
  客户端还可以指定数据流的优先级,优先级越高,服务器就先响应该请求。

 4.多路复用:HTTP2可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应。移除了HTTP1.1的串行请求,不需要排队等待,也就不会再出现 队头阻塞 的问题,降低了延迟,大幅度提高连接的利用率。

 5服务器推送:服务器不再是被动的响应,也可以主动向客户端发送消息。例如在浏览器刚请求HTML的时候,就提前把可能用到的JS、CSS文件等静态资源主动发给客户端,减少延时的等待,即服务器推送。

  HTTP2的缺陷:
   多个HTTP请求复用一个TCP连接,下层TCP协议是不知道有多少个HTTP请求的,一旦发生丢包,就会引发一系列丢包重传机制,这样一个TCP连接的所有HTTP请求都必须等待这个丢了的包被重传成功,就会阻塞后面所有的HTTP请求。这是基于传输层协议的问题。

HTTP3相比于HTTP2优化了什么
UDP发生是不管顺序,也不管丢包的,所以不会出现HTTP1.1队头阻塞,和HTTP2的一个丢包,阻塞后面的HTTP请求问题。但UDP是不可靠传输的,基于UDP的 QUIC协议 可以实现类似TCP的可靠性传输。

 1.基于QUIC传输层。当某个流发生丢包时,只会阻塞这个流,其他流不会收到影响。
 2.TLS1.2+升级成了TLS1.3+版本
 3.头部压缩算法升级成了QPack
 4.HTTPS要建立一个连接,先建立TCP三次握手,然后是TLS1.3三次握手。QUIC直接包TCP和TLS1.3的六次交互合并成了3次,减少了交互次数。


总结


在浏览器地址栏中输入一个URL都发生了什么?

一、应用层角度

(1)浏览器解析URL,如果是域名,通过DNS服务器,将域名转换成IP,构建HTTP请求(GET请求)。
  1.解析器向DNS服务器查询IP地址。

  2.浏览器先搜索 自己的DNS缓存 (维护一张域名与IP的对应表);若没有,则搜索 操作系统的DNS缓存 (维护一张域名与IP的对应表);若没有,则搜索操作系统的 hosts文件(维护一张域名与IP的对应表)。若都没有,则找 tcp/ip 参数中设置的 首选 dns 服务器,即本地 dns 服务器(递归查询),本地域名服务器查询自己的dns缓存,如果没有,则进行迭代查询。将本地dns服务器将IP返回给操作系统,同时缓存IP。

  3.找到了网站的IP地址,将其返回。
  4.开始进行通信
(2)Tomcat收到了请求,根据路径,确定对应的Servlet对哪个对象进行处理,根据请求方法调用对象的对应方法。执行Servlet业务代码,得到填充好的响应对象。并根据响应对象构建HTTP响应,发送给浏览器。

(3)浏览器读取响应,若还要进行重定向(执行JS代码),可能还会触发新的HTTP请求。

(4)浏览器得到显示页面的所有资源,构建DOM树(包含JS处理过的情况),并进行CSS渲染,产生最终的页面。

(5)用户看到结果页面。

二、传输层角度(TCP)

1.TCP三次握手建立连接后,再发送HTTP请求。
 1.开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态

 2客户端会随机初始化序号( client_isn ),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。

 3.服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号( server_isn ),将此序号填入TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1 , 接着把 SYN和 ACK 标志位置为 1 。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。

 4.客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。

 5.服务器收到客户端的应答报文后,也进入 ESTABLISHED 状态。

2.TCP四次挥手断开连接。
 1.客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进 FIN_WAIT_1 状态。
 2.服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入CLOSED_WAIT 状态。(被动关闭连接的,才有CLOSED_WAIT状态)
 3.客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
 4.等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
 5.客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入TIME_WAIT 状态。(主动关闭连接的,才有 TIME_WAIT 状态)。
 6.服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭。
 7.客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭。

三、网际层角度(广域网数据传输流程)

 (1)源主机发送HTTP请求目标主机(服务器),根据DNS将域名转换为IP。

 (2)从上到下封装数据:
   应用层:HTTP协议首部
   传输层:TCP协议首部(源端口、目的端口)
   网络层:IP协议首部(源IP、目的IP)
   数据链路层:以太网帧(源MAC、目的MAC)

 (3)查看目的主机是否和本机是同一网段(子网掩码位运算)。吐过是同网段使用局域网数据流程(交换机)。

 (4) 如果要跨网段,本机无法处理跨网段的数据报,交给网关(路由器)处理:
   1.找到本机相关的网关设备IP
   2.ARP寻址,根据网关IP查找对应的MAC地址。
    ARP寻址:ARP借助ARP请求与ARP响应两种类型的包确定MAC地址。
    ①主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包,其中包含主机B的IP地址。
    ②由于广播的包可以被同一个链路上所有的主机或路由器接收,因此ARP的请求包就会被这同一链路上的所有主机和路由器进行解析。
    ③如果ARP请求包中目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址塞入ARP响应包返回给主机A。

 (5)发送数据报到网关设备,目的MAC为路由器的MAC。

 (6)局域网内交换机根据目的MAC找到对应网关端口,并转发数据报到网关。

 (7)网关解析数据报(中间网关设备都是如此流程):
   1.从下到上分用
   2.基于NAPT协议转换源IP为路由器公网IP;源端口为路由器公网端口。
   3.基于路由技术,通过路由表计算路线,获取正确方向的下一设备IP。
   4.ARP寻址:根据下一设备IP找到下一个设备MAC。
   5.封装数据报并发送给下一个设备。

 (8)最终到达目标主机,接收数据,从下到上分用:
   数据链路层:目的MAC一致,接收。
   网络层:目的IP一致,处理。
   传输层:根据端口找到对应进程。
   应用层:把数据交给应用,由应用洗衣解析。

 (9)将源IP和目的IP,源端口和目的端口交换,按同样的流程返回响应数据报。