网络相关

21
四月
2021

网络相关


文章目录

  • 网络相关
  • 前言
  • 一、网络通信过程
    • 1.客户端
    • 2.服务端
  • 二、TCP连接过程
    • 1. 连接过程(三次握手)
    • 2. 数据传输阶段
    • 3. 断开阶段(四次挥手)
  • 三、HTTPS
    • 1 网络存在的风险
    • 2 加密算法
      • 2.1 对称算法
      • 2.2 非对称算法
      • 2.3 对称+非对称
    • 3 数字证书
      • 3.1 证书概述
      • 3.2 证书验证
      • 3.3 证书链
      • 3.4 hash算法
    • 4 安全模型
  • 四 长连接&短连接


前言

很多面试要求罗列当中都会有一条,精通网络编程,那么到底什么是网络编程呢?

一、网络通信过程

1.客户端

  1. 在浏览器输入网址
  2. 浏览器解析地址,生成http请求信息
  3. 经过系统解析器向DNS服务器发送http请求信息,查询ip地址
  4. 将http消息和IP地址交给TCP模块
  5. TCP会将消息拆分成数据包,并在头部添加TCP头
  6. TCP头消息包含接发方端口,数据包序号,ACK号
  7. 把数据交给IP模块,添加IP头和MAC头
  8. IP头包含IP地址,MAC头包含Mac地址
  9. IP模块把整个消息包交给网络硬件,也就是数据链路层,比如以太网、wifi
  10. 网卡会将这些包转成电信号、光信号,通过网线或者光纤发出去,再由路由器等转发设备送达接收方

2.服务端

  1. 数据包到达服务器的数据链路层,比如以太网,然后将其转换成数据包(数字信号)交给IP模块
  2. IP模块会将Mac头和ip头后面的内容,就是TCP数据包发送给TCP模块
  3. TCP模块会解析TCP头信息,然后和客户端沟通表示接收到这个数据包了
  4. TCP模块在收到消息的所有数据包值后,就会封装消息,生成相应报文给应用层(http层)
  5. http层收到消息,比如json数据,就会解析这个数据,最终绘制到浏览器页面上

二、TCP连接过程

1. 连接过程(三次握手)

  • 创建套接字Socket,服务器会在启动的时候就创建好,客户端是在需要访问服务器的时候创建套接字
  • 然后发起连接操作,其实就是Socket的connect方法
  • 这时候客户端会生成一个TCP数据包。这个数据包的TCP头部有三个重要信息:SYN、SEQ、ACK。
  1. 所以客户端就生成了这样一个数据包,其中头部信息的SYN设置为1,代表连接。SEQ设置一个随机数,代表初始序号,比如100。ACK没有设置,因为是第一次发送数据,不需要ACK。
  2. 然后服务器端收到这个消息,知道了客户端是要来连接的(SYN=1),知道了传输数据的初始序号(SEQ=100)。
    服务器端也要生成一个数据包发送给客户端,这个数据包的TCP头部会包含三个值:表示我也要连接你的SYN(SYN=1),我已经收到了你的上个数据包的确认号ACK(ACK=SEQ+1=101),以及服务器端随机生成的一个序号SEQ(比如SEQ=200)。
  3. 最后客户端收到这个消息后,表示客户端到服务器的连接是无误了,然后再发送一个数据包表示也确认收到了服务器发来的数据包,这个数据包的头部就主要就是一个ACK值(ACK=SEQ+1=201)。
  4. 至此,连接成功,三次握手结束,后面数据就会正常传输,并且每次都要带上TCP头部中的SEQ和ACK值。

这里有个问题是关于为什么需要三次握手?

最主要的原因就是需要通信双方都确认自己的消息被准确传达过去了。

A发送消息给B,B回一条消息表示我收到了,这个过程就保证了A的通信能力。B发送消息给A,A回一条消息表示我收到了,这个过程就保证了B的通信能力。

也就是四条消息能保证双方的消息发送都是正常的,其中B回消息和B发消息,可以融合为一次消息,所以就有了三次握手。

2. 数据传输阶段

数据传输阶段有个改变就是ACK确认号不再是SEQ+1了,而是SEQ+数据长度。例如:

  • A发送给B的数据包(SEQ=100,长度=1000字节)
  • B回给A的数据包(ACK=100+1000=1100)

这就是一次数据传输的头部信息,ACK代表下个数据包应该从哪个字节开始所以等于上个数据包的SEQ+长度,SEQ就等于上个数据包的ACK。

当然,TCP通信是双向的,所以实际数据每个消息都会有SEQ和ACK:

  • A发送给B的数据包(ACK=200,SEQ=100,长度=1000字节)
  • B回给A的数据包(ACK=100+1000=1100,SEQ=上一个数据包的ACK=200,长度=500字节)
  • A发送给B数据包(SEQ=1100,ACK=200+500=700

3. 断开阶段(四次挥手)

和连接阶段一样,TCP头部也有一个专门用作关闭连接的值叫做FIN。

  • 客户端准备关闭连接,会发送一个TCP数据包,头部信息中包括(FIN=1代表要断开连接)。
  • 服务器端收到消息,回复一个数据包给客户端,头部信息中包括ACK确认号。但是此时服务器端的正常业务可能没有完成,还要处理下数据,收个尾。
  • 客户端收到消息。
  • 服务器继续处理数据。
  • 服务器处理数据完毕,准备关闭连接,会发送一个TCP数据包给客户端,头部信息中包括(FIN=1代表要断开连接)
  • 客户端端收到消息,回复一个数据包给服务器端,头部信息中包括ACK确认号。
  • 服务器收到消息,到此服务器端完成连接关闭工作。
  • 客户端经过一段时间(2MSL),自动进入关闭状态,到此客户端完成连接关闭工作。

这里有个问题是关于为什么需要四次挥手?

A发送断开消息给B,B回一条消息表示我收到了,这个过程就保证了A断开成功。B发送断开消息给A,A回一条消息表示我收到了,这个过程就保证了B断开成功。

其实和连接阶段的区别就在于,这里的B的确认消息和断开消息不能融合。因为A要断开的时候,B可能还有数据要处理要发送,所以要等正常业务处理完,在发送断开消息。

三、HTTPS

1 网络存在的风险

在没有经过任何加密手段的HTTP通信中,面临着三大危险:消息监听、消息篡改、冒充身份 。

2 加密算法

加密算法依旧是HTTPS安全通信中的重头戏。在理想的情况下,如若有一个加密算法使得仅有用户和服务可以加密解密,那么其实是不存在上面的安全问题的。但黑客本身,他也可以作为一个客户存在,普通客户可以加密解密,那么黑客也就可以做到。所以需要附加上动态因子来保证算法的安全。

下面介绍HTTPS中用到的加密算法。

2.1 对称算法

对称算法比较简单:加密和解密数据使用相同的密钥。

对称算法的优点就是效率很高,可以对长数据进行加解密。但对称算法也存在缺点。

第一是双方使用相同的密钥,无法辨别数据到底是由服务器加密还是客户端加密,也就是无法区分一个消息是由服务器发出还是由客户端发出。解决这个问题方法也很简单:双方加密使用不同的密钥 。

第二,通信双方难以确保拿到安全的密钥 。因为第一步总是需要通过网路通信来商量密钥,那可不可以使用固定的密钥?前面讲过,黑客也是一个客户,那么他也可以拿到密钥,这个算法就失去意义了。

2.2 非对称算法

对称算法是加密解密使用相同的密钥,而非对称算法是加密与解密使用不同的密钥 。

1、非对称加密有两把密钥:公钥和私钥。

2、公钥可公开给所有人,私钥必须自己保密,不给任何人拿到。

3、客户端可以使用服务器的公钥加密数据,而这份密文,只有服务器的私钥才能解开。

4、反过来,使用私钥加密的数据,也只有公钥可以解开。

非对称算法很好地解决了对称算法存在的问题:无法安全交换密钥 。服务器的公钥可以公开给所有的用户,当客户端首次访问服务器,服务器便把公钥返回即可。

但是对于非对称算法有一个很严重的缺点:性能极差 。所以我们可以将对称与非对称算法结合起来,解决上述问题。

2.3 对称+非对称

对称算法存在的问题是无法安全地互换密钥;因此第一步我们可以使用非对称算法来交换密钥,后续使用对称算法来进行通信。

1、当客户访问服务器时,服务器返回一个公钥。

2、客户端拿到公钥之后,对客户端密钥使用公钥进行加密之后发送给服务端。

3、服务端拿到客户端密钥之后对服务端密钥进行加密发送给客户端。

这样就完成了双方密钥的交换,后续可以使用密钥进行高效率通信。

到此我们的网络传输依旧不是安全的,因为,我们无法保证第一步服务器返回的公钥不会被黑客篡改。假如黑客把服务器返回的公钥转换成自己的公钥,后续他就可以对客户端的的所有消息使用自己的私钥解密。而问题的本质在于:我们无法辨别返回的数据是否是真的由服务器返回的 。这个问题的解决方法就是:使用数字证书来证明信息发送方的身份 。

3 数字证书

经过前面加密算法的讨论,对称+非对称算法已经可以解决大部分的网络安全问题。但第一步服务器返回的公钥仍旧有被黑客篡改的风险,因为我们无法确保通信对方的身份。数字证书的引入,就是为了解决这个问题。

3.1 证书概述

数字证书是由公认的证书机构颁发给服务器的一个用于验证身份的数字认证。

服务器的证书中,包含有服务器信息例如公钥等、证书签名、证书机构信息等。客户端拿到服务器的证书,进行证书验证后,就可以准确得到服务器的公钥,利用这个公钥,就可以实现上述的算法加密了。

总之,数字证书的作用就是证明数据的来源,安全获取到服务器的公钥进行加密通信 。

3.2 证书验证

1、服务器向证书机构申请证书,同时提供自己的域名、地址、公钥等信息。

2、证书机构对服务器的信息使用hash算法得出一份128位的摘要,并对这份摘要使用自己的私钥进行非对称加密得到证书数字签名。

3、证书机构把服务器信息(明文)+数字签名+证书机构信息(包含证书机构公钥)发送给服务器。

4、客户端请求服务器时,服务器把证书返回给客户端。

客户端验证证书的重点就是:比较摘要 :

1、客户端拿到证书,得到服务器信息、数字签名、证书机构信息。

2、客户端对服务器信息进行hash算法计算得出一份摘要S1。

3、客户端使用证书机构的公钥对数字签名进行解密得到一份摘要S2。

4、对比S1和S2即可辨别此证书是否来自服务器且没经过篡改。

3.3 证书链

客户端验证证书的流程很简单:使用证书机构公钥解开证书的数字签名后进行比对即可。但这里有一个问题:如何保证证书机构的公钥可信 ?假如黑客使用自己的私钥加密,同时把证书机构的公钥修改成自己的公钥,那岂不是非常危险?

互联网中的主机对象非常多,但证书机构却不多。计算机产商,会在系统中安装一些根证书机构的信息,其中就包含了这些机构的公钥。这些公钥是在一定程度上是绝对安全的,是可以信任的。客户端可以使用这些公钥对数字签名进行解密。安全问题,终于得到了完美的解决。

系统中预装的证书机构是有限的,但世界上每时每刻申请数字证书却非常多,他们“忙不过来”,因此有了二级证书机构。二级证书机构由根证书机构签发,二级证书机构再去给服务器签发证书。那么此时如何进行证书验证呢?还是一样的道理:

1、利用根证书机构给二级证书机构签发的时候同样是一份数字证书,其中包含了二级证书机构信息、数字签名、根证书机构信息。

2、服务器的数字证书中包含了二级证书机构的数字证书。

3、客户端使用根证书机构的公钥对二级证书机构的数字签名进行解密得到摘要再进行比对,得到二级证书机构的公钥。

4、使用二级证书机构的公钥对服务器证书进行验证。

3.4 hash算法

我们会发现,证书并不是直接对服务器信息进行加密,而是利用hash算法得到服务器信息的摘要,再对摘要进行加密。那这里可能会有这些问题:

1、直接对信息进行加密不可以吗?为什么多此一举?

2、只对摘要进行加密,那么原文内容不是泄露了吗?

hash算法最常用的就是MD5,他可以把一段数据转化成一个128位的长度的摘要,不同的数据,会得到不同的摘要。

摘要的长度更短,使用非对称加密的效率更高。因此,证书中对摘要而不是直接对信息进行加密可以提高网络效率。而服务器信息本身并不是敏感信息,不怕被黑客截取监听,所以可以使用明文传输。

hash算法不仅为了提高效率,更重要的是可以辨别信息是否遭受了篡改。

4 安全模型

需要特别注意的是,HTTPS并不是一个新的应用协议来取代HTTP,而是在HTTP的基础上,增加了网络安全的内容。HTTPS的全称:Hyper Text Transfer Protocol over SecureSocket Layer,建立在安全socket层次上的超文本传输协议,可以认为HTTPS = HTTP+SSL。

HTTPS在HTTP和TCP之间建立了一个安全连接层 。SSL/TLS层次和TCP很类似,双方建立TCP连接之后,需要再建立安全连接。与TCP连接一样,SSL连接本质上,是对双方安全信息的记录,并不是一个真正意义上的连接。HTTP通过安全连接,即可与目标主机进行安全的通信,不怕被监听、篡改、冒充身份。

这里的SSL与TLS指的都是安全协议。SSL全名Secure Sockets Layer,安全套接字层协议;TLS全名Transport Layer Security,安全传输层协议。TLS从SSL发展而来,SSL是早期的安全层协议;后期逐渐发现了其安全漏洞,发展出了TLS。现在使用的最多的是TLS1.2、TLS1.3版本。

此外,建立安全连接是比较消耗性能的。如果每次请求都建立一次安全连接,那么网络的效率将会大打折扣。因此,在建立一次安全连接之后,服务器会存储客户端的安全相关信息,在一定时间内通信时无需再次建立安全连接,服务器会把先前的密钥等信息发送给客户端,直接使用此前已经记录的安全信息即可。

四 长连接&短连接

待补充。。。

TAG

网友评论

共有访客发表了评论
请登录后再发布评论,和谐社会,请文明发言,谢谢合作! 立即登录 注册会员