我们为了可以在互联网进行相关的通信,一定要保证一定的协议下进行通信,才能让彼此知道对方想要做什么?
协议中的三要素,
语法:一段的内容要符合一定的规则或者格式,比如括号必须成对出现?
语义:这段内容的含义,要做什么?
顺序:先干啥,后干啥,比如,加上某个数值,再去减去某个数值
我们有了这个规定的协议,就能控制一大批的机器去协作,去共同做一件事,这既是网络协议
那么,假如我们按照一段HTTP协议的东西,进行请求一次
我们请求一个网站,获得结果是如下的HTTP协议
HTTP/1.1 200 OK
Date: Tue, 27 Mar 2018 16:50:26 GMT Content-Type: text/html;charset=UTF-8 Content-Language: zh-CN <!DOCTYPE html> <html> <head> <base href=”https://pages.kaola.com/” /> <meta charset=”utf-8″/> <title>网易考拉3周年主会场</title> |
那么HTTP协议的语法就是如上,先是状态,然后是首部,最后是内容
在语义上,他们利用一个状态码来表示协议的状态
最后顺序,上面的顺序是不会变的,而且必须在我们发出HTTP请求后才能返回
我们常说的网络协议呢?
假设我输入了
这就是一个URL,对于浏览器来说,这是一个名字,但是对应的地址不知道,所以他需要去DNS服务器去找,或者使用HTTPDNS来查找对应协议
最后解析得到了对应的地址112.80.248.75
有了这个IP地址,我们需要知道怎么去这个IP地址,发往请求
1.首先浏览器会打包这个请求,打包方式不同,对于一般的请求,是HTTP协议的,对于一些购物的协议,则需要加密,使用了HTTPS协议,但是协议内部都会写了买什么和买多少
然后在这一层,我们叫做应用层,打包过后,进行传输给下一层去完成,就是传输层,中间使用了Socket编程,然后传输层会选择使用TCP或者UDP协议传输,一般在支付的时候,我们会使用TCP协议传输,TCP是一种保证稳定的协议,能够确保这个包能够到达目的地,如果不能到达,就重发
TCP协议中包含了两个端口,一个是浏览器监听的端口,就是自身端口,一个是电商的端口,就是目的端口
双方的操作系统就是通过端口来判断,这个包应该给哪个进程
传输层完成后,浏览器会传给操作系统的网络层
网络层就是IP协议,里面会包含着源IP,目的IP
知道了目的IP,就需要根据这个IP找到对应的机器,操作系统先判定,这个IP是否在本地,不在的话,需要进行外地寻找,也就是互联网环境,从本地跨往外地需要过网关,
而一般一个系统启动的时候,就会被DHCP协议分配了IP地址和对应的网关IP地址192.168.1.1
然后如何知道我们这个本地网络的网关在哪呢?基本靠吼,也就是在本地广播一下,等待网关的回应,这个广播利用的就是ARP协议,而网管回应的,则是网关的MAC地址
然后这就从IP层走到了MAC层,网卡会将包发送出去,
网关收到包之后,需要知道往哪里发送,
路由器中就具有路由表
表里会告诉你的下一跳要往哪里走,就好比我们出去问路,有人不会直接告诉你目的地,而是告诉你先到哪里,再到哪里,再到那里
而不同路由器直接是有沟通的,就是路由协议,常见的是OSPF和BGP两种
然后我们一直走到了最后的一个城关的地址,最后的一个城关知道网络包的位置,于是,对着这个IP段广播了一下,谁是目的IP啊,然后就能知道具体的服务器的MAC地址,然后通过这个MAC地址找到目的服务器,目的服务器发现MAC地址对上了,取下来MAC头,发给操作系统的网络层,发现IP也
对上了,就取出来IP头,IP头上会表示我们使用的什么协议,,TCP,然后传给传输层
在这一层,我们对于收到的包进行确认,就是返回一个确认收到的回复
对于上面的流程,如果我们客户端发送了这个请求后,一直没有回到返回的包,会重新发送这个包
TCP会一直尝试重发,知道出现一些问题
当网络包到达了TCP层后,TCP头中有目的的端口号,就是找到了监听这个端口的进程
然后接受到HTTP请求后,就是内部的做的事情了
内部如果是微服务的话,还会通过RPC调用,通过远程调用的方式实现,RPC的实现很多种,有HTTP内部报文的,有TCP报文的
然后处理完成后,回复一个HTTPS的包,告诉下单成功,整个流程结束
一个简单的请求过程中,涉及了这么多的协议,那么我们会依次学习这些网络协议
课后思考
1.为何通过路由表获取到了IP地址了之后,还需要通过本地的MAC地址呢?
因为上面说了DHCP会在启动的时候分配IP地址,也就是可能是动态的,而Mac地址是写死在网卡中,是不会改变的
这就好比,Mac地址就是你的身份证,但是身份证上的地址不是你现在的地址,而Ip能确定你现在的地址,确定了现在的地址之后,再利用Mac去确定身份
在整体的传输过程中,保存着的ip地址不变,也就是目的地址和源地址,但是没经过一个网关,就会改变源mac和目的mac,利用mac的变化来保存下一跳
所以下一跳看起来是IP地址,其实是通过ARP得到MAC地址,然后将MAC地址放在目的MAC地址中
2.MAC地址是否会变
mac被称为硬件地址,长度是6字节,分为前24位和后24位,前面的交给组织唯一标志符
是厂家的标识,后面的是伸长的ID,是厂家分配的,
虽然MAC伴随的设备越生产越多,越来越可能出现冲突,但是在一个局域网内还是很少见的,即使有了,也很好解决
3.TCP重试是否可能导致重复下单?
TCP层的重复尝试,并不会引起HTTP层的恐慌,因为TCP层会进行相对应的去重工作
那么什么时候会导致重复下单呢?是因为TCP连接断了,导致的HTTP重发
或者请求被黑客拦截,导致的发送多了,当然,在Https中,有很手段
4.TCP报平安的包是否是原路返回
当然不是,这里的原路返回是指的是原样返回,并不是完全一样的路径
5.最后一跳的时候,IP改变了怎么办?
如果原本的IP不见了,那么ARP会找不到,导致发送包失败了,IP层的工作就结束了
但是TCP层会重试,超过一定次数则会放弃,如果重启了,IP还是原来的,但是端口没有启动,导致不行
即使起来了端口,因为TCP的服务器端是新的,导致对不上Sequence Number,根本不是原本的连接,会发送RST
只有那种热迁移的虚拟机,什么都不变,才能直接对上
6.TCP层报的平安,如何确定浏览器收到了呢?
这并不保证一定收到了,而是通过一个Socket获取到TCP连接,然后从中读取数据,当读取失败的时候,也可以直接抛出错误
7.ARP协议在哪一层
这其实并不规范,可以说是介于第二层和第三层之间吧,但是这个没有必要深入了解