/基础网络拓扑结构//三次握手四次挥手/
1.基础网络拓扑结构
最开始,我们只需要用一根网线将你想要通信的电脑进行连接
但是如果加入的电脑过多,我们就需要加入集线器,并且通过双方的Mac地址进行发送数据。
集线器有一个非常大的问题,就是它只能无脑将数据包发送给每个端口的电脑,于是我们需要把集线器替换成交换机。此时需要注意,集线器在物理层,而能够保存各个端口电脑的交换机在数据链路层,他们之间的通信仍然在采用Mac地址。交换机通过Mac地址表将数据包发送给指定电脑
但是当一台交换机的端口不足以满足越来越多的电脑加入的时候,我们又需要引入路由器来管理不同的交换机。于是IP地址和子网的概念出现了。值得注意的是IP地址只是软件层面的,可以随意修改,但是Mac地址是硬件层面的,最终数据的接收和发送还是靠它。
有了路由器(网络层),路由器可以管理不同的交换机,通过路由表将不同子网的通信数据发送到指定子网内的交换机,再由交换机转发到指定电脑。
这里面涉及到子网的问题,其中有以下几个注意点:
1.什么是子网
可以简单理解为每一个交换机管辖的几台电脑为同一个子网
如果与通信的另一台计算机处于同一子网需要通过交换机转发出去
如果与通信的另一台计算机处于不同的子网就要通过路由器转发出去
2.如何知道对方的计算机与自己处于同一子网或者不同子网?
子网掩码的使用
通过子网掩码和IP地址做与运算便可得知是否在同一子网
3.如何知道交换机的地址?
默认网关就是交换机的地址
3.虽然各个电脑在通信中使用的是IP地址,以方便寻找不同子网的计算机,但是最终数据接收和发送还是要通过Mac地址,那么如何做到Mac地址和IP地址的转换?
arp
假如你(A)此时不知道你同伴 B 的 MAC 地址(现实中就是不知道的,刚刚我们只是假设已知),你只知道它的 IP 地址,你该怎么把数据包准确传给 B 呢?
答案很简单,在网络层,我需要把 IP 地址对应的 MAC 地址找到,也就是通过某种方式,找到 192.168.0.2 对应的 MAC 地址 BBBB。
这种方式就是 arp 协议,同时电脑 A 和 B 里面也会有一张 arp 缓存表,表中记录着 IP 与 MAC 地址的对应关系。
参考文章:https://www.cnblogs.com/flashsun/p/14266148.html
2.TCP三次握手四次挥手
在学习三次握手和四次挥手之前,需要先搞清楚3个小表示
syn:synchronize(三次握手时申请同步连接时使用)
ack:acknowledgement(三次握手和四次挥手都会使用)
fin:finish(四次挥手时使用)
三次握手
图上所示建立连接一共有三个步骤:
1.客户端向服务端发送syn请求建立连接,并随机生成一个序号一起发送给服务端(8633)
2.服务端收到请求后会响应给客户端一个syn+ack来确认同步连接,并生成一个序列号(303)再加上一个确认号(客户端序号+1)一起发送给客户端,客户端只需要将确认号减一就知道是否是属于自己的连接。
3.客户端再次向服务端发送确认请求ack,来回应服务端的确认,此时它的序号变为服务端的确认号,确认号则是服务端的序号+1,由此3次握手完成
注意:
当服务端向客户端发送syn+ack的时候,会挂起资源等待客户端的回应,如果客户端一直发起同步请求而不回应,就会导致服务端崩溃,这就是著名的DDos攻击,所以,现在服务端已经不会保存相应序号和确认号,而是通过一些算法得知最后的确认是否为自己的连接。
四次挥手
1.客户端向服务端发送fin+ack向服务端发起关闭连接请求,但是此时的序列号和确认号因为多次请求无限增加,所以已经到了一个不可预估的数值,但是还是会打包发给服务端。
2.服务端此时收到了客户端的请求,但是它会先发送一个ack和随机生成的序列号,还有确认号(对方序号+1)表示自己已经收到,但是不会立马关闭连接,因为它还要确认是否有多余的数据或者没有发送完毕的数据要发送给客户端。
3.在确认资源发送完毕后,服务端会再次发送fin+ack,还有序号和确认号给客户端。
4.客户端在收到后会发送一个ack给服务端,序号为对方确认号+1,确认号为对方序号+1
3.http
什么是http?
http是服务端与客户端的传输协议,http传输时就会发送请求报文和响应报文,结构如下:
1.请求和响应:
大致由起始行,首部和主体组成:
2.请求方法/状态码:
大致分为get和post,其他的请求方法大多以这两种为基础
而状态码多种多样,并且服务端还可以自定义状态码,但是也是有规律的:
3.首部
如果说状态码是多种多样的,那么首部简直是多如牛毛,但是首部由一个content- type来定义内容的类型,浏览器就能更加清楚如何去处理不同的数据,比如图片,字符串,数字,视频等等。。。
4.应用层(基于tcp)
说完了报文,那么报文是按照什么形式发送出去的呢?
事实上,大家都知道http是工作在应用层的,当我们在浏览器地址栏输入网址的时候,浏览器会自动帮我们补全http协议和端口(通常是80),浏览器也会因为我们输入的网址可以分析出服务器地址和资源位置,这样就能生成我们所需要的报文了。
而真正要把报文发送出去,还要查看传输层,在传输层选择协议,当然,最出名的两个协议就是tcp和udp两种协议了。当然绝大多数http协议会选择tcp协议,毕竟人家有三次握手规则,而udp的响应就显得有一些缺尽少两了。
5.持久和非持久连接
非持久连接指的就是服务器一次只处理一个请求,随后就会关闭连接,这样就会显的很麻烦,因为每次连接都会进行一次tcp三次握手。但是在http1.1中,已经实现了持久连接,建立连接后客户端可以多次发送请求,不用再重复连接,结束后可以发送connection:close的首部给服务器表示关闭连接。
但是持久连接也不是一直能保持的,有一定的时间限制。
6.http的无状态
为什么http要设置成无状态呢?原因要回到最初http设计之初,许多台主机都去访问服务器,那么服务器要记住每台主机的信息,这样服务器肯定是要崩溃的,于是http放弃了记录每台主机的状态。但是现在的很多业务需求都需要有状态的请求,比如登陆功能,不能让用户的每次访问都要重新登录一次,于是便诞生了cookie技术,这样就能保持登陆状态,实现有状态管理。
4.https
http的传输固然很好,但是它的保密性不高,只要懂点http的人都能看懂传输报文里面的内容,于是带有加密技术的https诞生了(tls+ssl)
不过http更加支持tls,但是由于ssl的名气很大,很多人会两种名字混合使用,因为这两根王老吉和加多宝差不多。
1.对称加密
对称加密是指,发送方用一种算法加密内容,另一方用对应的算法解析,不过这种加密方式一旦被破解,黑客就很容易知道内容是什么了。
2.非对称加密
假设电脑a和电脑b都有自己的私钥,这个私钥只有他们自己知道,除了私钥,他们还有一个共同的公钥。
于是,他们分别把自己的私钥和公钥混合在一起发送给对方,再用自己的私钥和对方发过来的数据包(私钥加公钥)混合在一起,就会得到他们双方所传输的数据。
这样即使黑客盗取了公钥以及他们传输的数据,也不会轻易解密(如图所示)
一般来说,服务器拥有私钥和公钥,它会公布自己的公钥,客户端把自己的数据和公钥一起加密,发送给服务端,而服务端不能用公钥来解密,一定要用私钥。其中的加密解密其实是由算法来完成,这里不详解,因为我也不会。
但是说实话,tls其实堆对称加密和非对称加密都有用上。
3.ssl证书
相信很多人都有一些疑问,就是当我吗=们访问一些网站,在地址栏输入网址的时候,我们经常会输错,但是却没有很多人钻这些空子导致我吗=们访问到非法网站。这是因为很多网站都会申请第三方的ssl证书,这个证书除了表明域名是谁的以外,最重要的就是自带公钥和私钥。
简单来说,只要服务器安装可了ssl证书之后,用户就可以通过https来访问服务器了。
浏览器也会把默认http端口80改为443
4.现在通过浏览器访问服务器具体有哪些变化?
其实有很多版本,这里以tls1.2的版本进行讲解:
a.客户端先向服务器发送自己的client hello打个招呼,并发送自己的tsl版本,和支持的加密套件,并发送一个随机数。
b.服务端收到请求后也会给客户端发一个server hello 打个招呼,并发送tsl版本和选取的加密套件,还有随机数。顺手把ssl证书和公钥(server key exhcange)发出,最后发一个server hello done 表示发送完毕。
此时,客户端已经拥有了服务器的公钥,并且双方各自有了第一随机数和第二随机数。
c.客户端收到公钥后会生成第三随机数:预主密钥,并加上公钥发送给服务端,服务端收到预主密钥后会通过自己的私钥解出真正的预主密钥。
d.最后客户端和服务端用第一随机数加上第二随机数再加上预主密钥计算出会话密钥,他们双方的会话密钥是相同的。
以上步骤就是非对称加密
而之后的会话就会使用会话密钥进行对称加密,也就不值得讲解了,因为非对称加密极度耗费资源,这就是tsl加密。