Java面试核心知识点整理2——网络

网络

OSI七层网络模型

网络的七层架构从下到上主要包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

  • 物理层
    物理层主要定义物理设备标准,主要作用是传输比特流,具体做法是在发送端将1、0转化为电流强弱来进行传输,在到达目的地之后再将电流强弱转化为1、0,也就是我们常说的模数转换与数模转换,这一层的数据叫做比特
  • 数据链路层
    数据链路层主要用于对数据包中的MAC地址进行解析和封装。这一层的数据叫做,在这一层工作的设备是网卡、网桥、交换机。
  • 网络层
    网络层主要用于对数据包中的IP地址进行封装和解析,这一层的数据叫做数据包。在这一层工作的设备有路由器、交换机、防火墙等。
  • 传输层
    传输层定义了传输数据的协议和端口号,主要用于数据的分段、传输和重组。在这一层工作的协议有TCP和UDP等。TCP是传输控制协议,传输效率低,可靠性强,用于传输对可靠性要求高,数据量大的数据,比如支付宝转账业务;UDP是用户数据报协议,用于传输可靠性要求不高,数据量小的数据,例如抖音等视频服务。
  • 会话层
    会话层在传输层的基础上建立连接和管理会话,具体包括登陆验证、断点续传、数据粘包与分包等。在设备之间需要互相识别的可以是IP,也可以是MAC或者主机名。
  • 表示层
    表示层主要对接收的数据进行解释、加密、解密、压缩、解压缩等,即把计算机能够识别的内容转换成人能够识别的内容(图片、声音、文字等)。
  • 应用层
    基于网络构建具体应用,例如FTP上传文件下载服务、Telnet服务、HTTP服务、DNS服务、SNMP邮件服务等。

TCP/IP四层网络模型

TCP/IP不是指TCP和IP这两个协议的合称,而是指因特网的整个TCP/IP协议簇。从协议分层模型方面来讲,TCP/IP由4个层次组成:网络接口层、网络层、传输层和应用层。

  • 网络接口层
    定义了主机间网络连通的协议,具体包括Echernet、FDDI、ATM等通信协议。

  • 网络层
    主要用于数据的传输、路由及地址的解析,以保障主机可以把数据发送给任何网络上的目标。数据经过网络传输,发送的顺序和到达的顺序可能发生变化。在网络层使用IP协议和ARP地址解析协议。

  • 传输层
    使源端和目的端的机器上的对等实体可以基于会话相互通信。在这一层定义了两个端到端的协议TCP和UDP。TCP面向连接的协议,提供可靠的报文传输和对上层应用的连接服务,除了基本的数据传输,它还有可靠性保证、流量控制、多路复用、优先权和安全性控制等功能。UDP面向无连接的不可靠传输的协议,主要用于不需要TCP的排序和流量控制等功能的应用程序。

  • 应用层
    负责具体应用层协议的定义,包括Telnet虚拟终端协议、FTP文件传输协议、SMTP简单电子邮件传输协议、DNS域名解析服务、NNTP网上新闻传输协议和HTTP超文本传输协议等。


TCP的三次握手/四次挥手

TCP数据在传输之前建立连接需要三次沟通,一般称为三次握手,在数据传输完成断开连接的时候要进行四次沟通,一般称为四次挥手。

TCP的数据包结构
在这里插入图片描述

  • 源端口:标识源主机的一个应用进程(连同源主机的IP地址)。

  • 目的端口:标识目的主机的一个应用进程(连同目的主机的IP地址)。IP报头中的源主机IP地址、目的主机IP地址和源端口、目的端口确定了唯一一条TCP连接。

  • 顺序号seq
    标识从TCP源端向TCP目的端发送的数据字节流,表示这个报文段中的第一个数据字节的顺序号。如果将字节流看作在两个应用程序间的单向流动,则TCP用顺序号对每个字节进行计数。序号是32bit的无符号数,序号到达2的32次方-1后又从0开始。在建立一个新的连接时,SYN标志变为1,顺序号字段包含由这个主机选择的该连接的初始顺序号ISN。

  • 确认号ack
    用来存储发送确认的一端所期望收到的下一个顺序号。确认序号是上次已经成功收到的数据字节顺序号seq加1。只有ACK标志为1的时候确认序号字段才有效。TCP为应用层提供全双工服务,这意味着数据能在两个方向上独立进行传输。因此连接的每一段都必须保持每个方向上的传输数据顺序号。

  • TCP报头长度
    存储报头中头部数据的长度,实际上指明了数据从哪里开始。需要这个值是因为任选字段的长度是可变的,该字段占4bit,因此TCP最多有60字节的首部,但没有任选字段,正常的长度是20字节。

  • 保留位
    数据保留位,目前必须被设置为0

  • 控制位
    在TCP报头中有6个标志比特,它们中的多个可同时被设置为1

    序号 控制位 说明
    1 URG 为1时表示紧急指针有效,为0时无效
    2 ACK 为1时表示确认号有效,为0时表示在报文段不包含确认信息,忽略确认号字段
    3 PSH 为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层,而不用等待缓冲区装满
    4 RST 用于复位由于主机崩溃或其他原因而出现错误的连接,还可以用于拒绝非法的报文段和拒绝连接请求。一般情况下收到RST为1的报文代表发生了某些问题。
    5 SYN 同步序号,为1时表示连接请求,用于建立连接和使顺序号同步。
    6 FIN 用于释放连接,为1时表示发送方已经没有数据要发送了,即关闭本方数据流
  • 窗口大小
    数据字节数,表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口的大小。窗口大小时16bit的字段,因而窗口最大为65535字节。

  • 校验和
    此校验和是对整个TCP报文段,包括TCP头部和TCP数据,以16位字符计算所得。这是一个强制性的字段,一定是由发送端计算和存储的,并由接收端验证。

  • 紧急指针
    只有在URG=1时才有效,这时告诉TCP该条数据需要紧急发送

  • 选项
    最常见的可选字段是最长报文大小,又叫做MSS。每个连接方通常都在通信的第1个报文段(为建立连接而设置SYN标志的那个段)中指明这个选项,指明该TCP连接能接收的最大长度的报文段。选项长度不一定是32字节的整数倍,所以要加填充位,使得报头长度成为整数字节。

  • 数据
    TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部,如果一方没有数据要发送,则也使用没有任何数据的首部确认收到的数据。在处理超时的许多情况下也会发送不带任何数据的报文段。


TCP的三次握手

TCP是因特网的传输层协议,使用三次握手机制建立连接。在客户端主动发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方式可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。

三次握手的过程如下:
(1)一开始服务器进程先创建传输控制块TCB,准备接收客户进程的连接请求,然后服务器进程就处于LISTEN(收听听)状态,等待客户的连接请求,如有则立即做出响应。客户端也是首先创建传输控制块,然后在打算建立TCP连接时,发送SYN(seq=x)报文给服务器端(TCP规定,SYN报文段不能携带数据,但要消耗掉一个序号),进入SYN-SENT(同步已发送)状态。

(2)服务器端收到SYN报文,如果同意建立连接,回应一个SYN(seq=y)和ACK(ack=x+1)报文(这个报文段也不能携带数据,但同样要消耗掉一个序号),进入SYN-RCVD(同步已接收)状态。

(3)客户端收到服务器端的SYN报文,回应一个ACK(ack=y+1)报文(TCP规定ACK报文段可以携带数据,但如果不携带数据则不消耗序号,这种情况下下一个数据报文段的序号仍是seq=x+1),进入ESTABLISHED(连接建立)状态。

为什么不采用两次握手?
答:防止已经失效的连接请求报文段突然传送到服务器端,而此时客户端可能已经关闭,服务器端同意建立连接后一直等待客户发送数据,从而导致许多资源将被浪费。
为什么不采用四次握手?
答:将服务端给客户端发送的SYN报文和ACK报文可以拆分位两个报文段发送,但效果是一样的。
在这里插入图片描述


TCP的四次挥手

TCP在建立连接时要进行三次握手,在断开连接时要进行四次挥手,这是由于TCP的半关闭造成的。因为TCP连接是全双工的(即数据可在两个方向上同时传递),所以在进行关闭时对每个方向都要单独进行关闭,这种单方向的关闭叫做半关闭。在一方完成它的数据发送任务时,就发送一个FIN来向另一方通告将要终止这个方向的连接。

TCP断开连接既可以是由客户端发起的也可以是由服务端发起的,以客户端发起关闭连接请求为例,四次挥手过程如下:
(1)双方初始都处于ESTABLISHED状态。客户端应用进程向服务器发送一个终止标志位FIN=1(TCP规定,FIN报文段即使不携带数据也要消耗掉一个序号),seq=u(u为前面已经传送过的最后一个字节的序号加1)的连接释放报文段,并停止再发送数据,主动关闭TCP连接。此时客户端处于FIN-WAIT-1状态
(2)服务器在收到这个FIN消息后返回一个ACK=1,ack=u+1,seq=v(v为服务器端前面已传送过的数据的最后一个字节的序号加1)的消息给客户端,表示接收到客户端断开连接的请求,这时TCP服务器端进程通知高层应用进程释放客户端到服务器端的连接,服务器处于CLOSE-WAIT关闭等待状态客户端在收到消息后处于FIN-WAIT-2状态,等待服务器端发出的连接释放报文段。这时TCP连接处于半关闭状态,即客户端已经没有要发送的数据,但若服务器端发送数据,客户端仍要接收。
(3)服务器端将断开连接前需要发送的数据发送给客户端,在等待该数据发送完成后,发送一个FIN=1,ACK=1,ack=u+1,seq=w(在半关闭状态服务端可能又发送了一些数据)的消息给客户端,表示关闭连接前服务器要发送的数据已发送完毕,请求客户端确认关闭从服务器到客户端的链路操作,此时服务器端处于LAST-ACK最后确认状态,等待客户端最终断开连接。
(4)客户端在接收到这个最终FIN消息后,发送一个ACK=1,ack=w+1,seq=u+1的消息给服务器端,表示接收到服务器端的断开连接请求并准备断开服务器端到客户端的链路。此时客户端处于TIME-WAIT状态,TCP连接还没有释放,然后经过等待计时器(2MSL)设置的时间后,客户端进入CLOSE状态服务端只要收到客户端发出的确认就进入CLOSED状态,服务端结束TCP连接的时间将略早于客户端。

为什么客户端在TIME-WAIT后必须等待2MSL的时间?
答:(1)为了保证客户端发送的最后一个报文段能够到达服务器端,假设客户端发出的ACK报文段丢失,服务器端将会超时重传这个FIN+ACK报文段,客户端就可以在2MSL时间内收到。(2)防止已失效的连接请求报文段,A再发送完最后一个ACK报文段后,再经2MSL时间,就可以使本连接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

在这里插入图片描述


HTTP

HTTP是一个无状态的协议,无状态指在客户端(Web浏览器)和服务器之间不需要建立持久的连接,在一个客户端向服务器端发出请求且服务器收到该请求并返回响应后,本次通信结束,HTTP连接将被关闭,服务器不保留连接的相关信息。

HTTP遵循请求(Request)/应答(Response)模型,客户端向服务器发送请求,服务器处理请求并返回适当的应答。

HTTP的传输流程

HTTP的传输流程包括地址解析、封装HTTP数据包、封装TCP包、建立TCP连接、客户端发送请求、服务端响应、服务端关闭TCP连接,具体如下:

  • 地址解析
    地址解析通过域名系统DNS解析服务器域名从而获得主机的IP地址。例如客户端的浏览器请求http://localhost:8080/index.html,则可分析出:协议名HTTP、主机名localhost、端口8080、对象路径/index.html
  • 封装HTTP数据包
    解析协议名、主机名、端口、对象路径等并结合本机自己的信息封装成一个HTTP请求数据包
  • 封装TCP包
    将HTTP请求数据包进一步封装成TCP数据包
  • 建立TCP连接
    基于TCP的三次握手机制建立TCP连接
  • 客户端发送请求
    在建立连接后,客户端发送一个请求给服务器
  • 服务器响应
    服务器在接收到请求后,结合业务逻辑进行数据处理,然后向客户端返回相应的响应信息。在响应信息中包含状态行、协议版本号、成功或错误的代码、消息体等内容。
  • 服务器关闭TCP连接
    服务器在向浏览器发送请求响应数据后关闭TCP连接。但如果浏览器或者服务器在消息头加入了Connection:keep-alive,则TCP连接在请求响应数据后仍然保持连接状态,在下一次请求中浏览器可以继续使用相同的连接发送请求。采用keep-alive不但减少了请求响应的时间,还节约了网络带宽和系统资源。

HTTP中常见的状态码

  • 消息响应
    100 继续
    101 切换协议

  • 成功响应
    200 成功
    201 已创建
    202 已接收
    203 未授权信息
    204 无内容
    205 重置内容
    206 部分内容

  • 网络重定向
    300 多种选择
    301 永久移动
    302 临时移动
    303 查看其它
    304 未修改
    305 使用代理
    306 未使用
    307 临时重定向
    308 永久重定向

  • 客户端错误
    400 错误请求
    401 未授权
    402 需要付款
    403 禁止访问
    404 未找到
    405 不允许使用的方法
    406 无法接收
    407 要求代理身份验证
    408 请求超时
    409 冲突
    410 已失效
    411 需要内容长度
    412 预处理失败
    413 请求实体过长
    414 请求URI过长
    415 媒体类型不支持
    416 请求范围不合适
    417 预期结果失败

  • 服务端错误
    500 服务器内部错误
    501 未实现
    502 网关错误
    503 服务不可用
    504 网关超时
    505 HTTP版本不支持


HTTPS

HTTPS是以安全为目标的HTTP通道,它在HTTP中加入SSL层以提高数据传输的安全性。HTTP被用于在Web浏览器和网站服务器之间传递信息,但以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP不适合传输一些敏感信息,比如身份证号码、密码等。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并对浏览器和服务器之间的通信进行数据加密,以保障数据传输的安全性,其端口一般是443。

HTTP的加密流程如下:
(1)发起请求:客户端在通过TCP和服务器建立连接之后(443端口),发出一个请求证书的消息给服务器,在该请求消息里包含自己可实现的算法列表和其他需要的消息。
(2)证书返回:服务端在收到消息后回应客户端并返回证书,在证书中包含服务器信息、域名、申请证书的公司、公钥、数据加密算法等。
(3)证书验证:客户端在收到证书后,判断证书签发机构是否正确,并使用该签发机构的公钥确认签名是否有效,客户端还会确认在证书中列出的域名就是它正在连接的域名。如果客户端确认证书有效,则生成对称密钥,并使用公钥将对称密钥加密。
(4)密钥交换:客户端将加密后的对称密钥发送给服务器,服务器在接收到对称密钥后使用私钥解密。
(5)数据传输:经过上述步骤,客户端和服务器就完成了密钥对的交换,在之后的数据传输过程中,客户端和服务端就可以基于对称加密(加密和解密使用相同密钥的加密算法)对数据加密后在网络上传输,保证了网络数据传输的安全性。

发布了66 篇原创文章 · 获赞 302 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_41112238/article/details/105056863