当前位置: 首页 > Linux

为什么要学习网络协议?

时间:2023-04-06 07:21:38 Linux

Linuxc/c++后台开发方向技术文章资料电子书整理2021-2000年大厂面经/面试题整理(腾讯、字节、阿里、百度、京东等)原文转载在:https://时间。geekbang.org/column/article/7581《圣经》有一个关于通天塔的故事,大致说的是为了不让人类团结起来,上帝让人类说不同的语言。人类无法沟通,如果无法达成“一致”,通天塔的计划就将失败。但几千年后,出现了一种叫做“程序猿”的物种,说着这个群体共同的语言,连??接着世界上所有的人,搭建起了互联网世界的高塔。当今世界因互联网而互联。记住你听到“HelloWorld!”时的激动心情。从你的显示器打印?publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");}}如果你是一个程序员,你必须理解上面这段话。这是每个程序员向计算机世界说“你好,世界”的方式。但是,你可能不知道,这段文字也是一种协议,一种人与计算机进行通信的协议。只有通过这个协议,计算机才能知道我们要它做什么。协议的三要素当然,这种协议还是比较接近人类语言的,机器无法直接理解,所以需要翻译。翻译工作交给编译器,也就是程序员常说的compile。这个过程比较复杂,编译原理也很复杂,这里就不赘述了。但是可以看出,计算机语言作为程序员控制计算机工作的一种协议,具有协议的三要素。语法是指这一段的内容必须符合一定的规则和格式。例如,一对括号,以分号结尾等。语义是指这段内容应该代表某种意思。例如,从数字中减去数字是有意义的,但从数字中减去文本通常没有意义。顺序是先做什么,后做什么。例如,您可以先添加一个值,然后再减去一个值。了解计算机语言,您可以教计算机做您的工作。恭喜,你开始了!但是,如果你想在互联网世界中建造一座通天塔,仅仅教一台机器做什么是不够的。你需要学会教大量机器做什么。这需要网络协议。只有通过网络协议,一大群机器才能相互协作,共同完成一件事情。这时候你可能会问,网络协议长什么样子,这么神奇,它能干什么?我先举个简单的例子,让大家试一试,再说一件大事。当你想购买一件商品时,通常的做法是打开浏览器,输入购物网站的地址。浏览器将显示一个彩色页面。你有没有深入思考过浏览器是如何做到这一点的?它之所以能显示出彩页,是因为它从HTTP协议接收了一块“东西”。我以网易考拉为例,格式如下:HTTP/1.1200OKDate:Tue,27Mar201816:50:26GMTContent-Type:text/html;charset=UTF-8Content-Language:zh-CNc/c++Linux后台开发学习交流群:202432010这样符合协议三要素吗?我带你去看看。首先,它是符合语法的,也就是说,只有按照上面的格式,浏览器才会识别。例如,先是状态,然后是标题,然后是内容。二是符合语义,即必须遵循约定的意思。例如,状态为200表示网页返回成功。如果不成功,就是我们常见的“404”。第三,按照顺序,你点击浏览器发送一个HTTP请求,然后就是上面HTTP返回的字符串。浏览器显然按照协议中约定的去做了,最后一个五颜六色的页面出现在了你的面前。我们常用的网络协议有哪些?接下来,我就揭晓我要说的大事,“双十一”。这和我们要讲的网络协议有什么关系呢?在经济学方面,有LeonardE.Read的《铅笔的故事》。这个故事通过铅笔的诞生过程讲述了复杂的经济理论。在这里,我还用一个下单的过程,看看互联网世界的运行都使用了哪些网络协议。你先在浏览器中输入https://www.fulingqu.com,这是一个网址。浏览器只知道“www.xuexizliao.com”这个名字,不知道具体位置,所以不知道如何访问。因此,它打开地址簿进行查找。可以使用通用的通讯录协议DNS进行搜索,也可以使用另一种更精确的通讯录搜索协议HTTPDNS。不管你用哪种方法搜索,最终都会得到这个地址:106.114.138.24。这就是IP地址,也就是互联网世界的“门牌号”。知道目标地址后,浏览器开始打包它的请求。对于普通的浏览请求,经常使用HTTP协议;但对于购物请求,往往需要加密传输,所以使用HTTPS协议。不管是什么协议,都会写明“你想买什么,买多少”。DNS、HTTP、HTTPS所在的层称为应用层。应用层封装后,浏览器会将应用层封装交给下一层完成,这是通过socket编程实现的。下一层是传输层。传输层有两种协议,一种是无连接协议UDP,一种是面向连接协议TCP。对于支付,通常使用TCP协议。所谓面向连接,就是TCP会保证数据包能够到达目的地。如果它不能到达,它将被重新发送,直到它到达。TCP协议中有两个端口,一个是浏览器监听的端口,一个是电商服务器监听的端口。操作系统往往会判断自己拿到的包应该通过端口给哪个进程。传输层封装后,浏览器会将数据包交给操作系统的网络层。网络层的协议是IP协议。在IP协议中,会有源IP地址,即浏览器所在机器的IP地址和目标IP地址,即电子商务网站所在服务器的IP地址.既然操作系统知道了目标IP地址,就开始思考如何根据这个门牌号找到目标机器。操作系统经常会判断目标IP地址是本地的还是外地的。如果是本地人,从门牌号就能看出来,但显然电商网站不在本地,而是在很远的地方。操作系统知道离开本地去远程。虽然不知道远在何处,但我可以打个比方:出国要到海关,到外地要到关口。操作系统启动时,会通过DHCP协议配置IP地址,默认网关IP地址为192.168.1.1。操作系统如何将IP地址发送给网关?本地通信基本靠吼,所以操作系统吼,谁是192.168.1.1?网关会回答,我是,我的本地地址在村东头。这个本地地址就是MAC地址,吼吼就是ARP协议。于是操作系统将IP包交给了下一层,也就是MAC层。然后网卡将数据包发送出去。由于此数据包包含MAC地址,因此它可以到达网关。网关收到数据包后,会根据自己的知识判断下一步该做什么。网关往往就是一个路由器,怎么去某个IP地址,这个就叫路由表。路由器有点像玄奘西行途经的各国城门。每个城门都连接着两个国家,每个国家相当于一个局域网。在每个国家内部,可以使用本地地址MAC进行通信。过了城门,需要把IP头拿出来,上面写着穷和尚来自东方唐朝(即源IP地址),想去西方拜佛并求经(指目标IP地址)。路过宝坻,过夜,明日出发,接下来怎么走?城关经常知道这个“知识”,因为城关和邻近的城关经常互相交流。去哪里,怎么去,这种通信协议叫做路由协议,常用的有OSPF和BGP。城关与城关之间有一国。当网络包知道下一步要去哪个城关时,它仍然需要通过下一个城关的MAC地址,使用国MAC地址找到下一个城关,然后询问下一步。一直走到走出最后一扇门。最后一个门知道这个网络数据包要去哪里。那么,对着这个国家喊,目标IP是谁?目标服务器将回复一个MAC地址。网络包过关后,可以通过这个MAC地址找到目标服务器。目标服务器发现MAC地址匹配,去掉MAC头,发送给操作系统的网络层。发现IP也是对的,所以去掉IP头。在IP头里面写了一层封装,就是TCP协议,然后交给传输层,也就是TCP层。在这一层中,对于每个接收到的数据包,都会有一个回复数据包表明它已被接收到。这个回复包绝不是这个订单请求的结果,比如购物是否成功,扣了多少钱等等,而只是TCP层的描述,即收到后的回复。当然,为了这个回复,我会按照刚才来的方向往回走,报告我安全了。因为一旦出国,西行之路充满艰险。如果过程中网络丢包,比如进入沙漠,或者被强盗抢劫杀害怎么办?所以当我到达时,我想报告我的安全。如果过了一段时间还没有到达,发送端的TCP层会重新发送数据包,并继续上述过程,直到有一天回复安全到达。本次重试绝不是您的浏览器重新请求下单动作。对于浏览器来说,发送一个订单请求,TCP层自己不断重试。除非是TCP层出了问题,比如连接断了,才轮到浏览器的应用层重新发送订单请求。当网络数据包安全到达TCP层时,TCP报头包含目标端口号。通过这个端口号可以发现电商网站的进程正在监听这个端口号。假设有一台Tomcat,将这个数据包发送到电商网站。电商网站的进程拿到HTTP请求的内容,就知道要买什么,买多少。往往最初接收电商网站请求的Tomcat只是一个接待员,负责协调处理请求,而不是什么都自己做。比如接待员需要告诉订单管理流程,注册购买某个产品,买多少,告诉库存管理流程,减少库存多少,告诉支付流程,应该支付多少,以及很快。如何告诉相关过程?往往通过RPC调用,即远程过程调用来实现。远程过程调用是指在告诉管理订单流程时,前台不需要关心中间的网络互联问题,由RPC框架统一处理。RPC框架有很多种,有的基于HTTP协议,放在HTTP报文中,有的直接封装在TCP报文中。当接待员发现对应部门处理完毕后,会回复一个HTTPS包,通知下单成功。这个HTTPS包就像来的时候一样,会历尽千辛万苦到达你的个人电脑,最后进入浏览器,显示支付成功。总结看吧,一个简单的下单流程,涉及到这么多协议。而管理大面积的机器是一件特别技术性的事情。另外,最近比较火的云计算、容器、微服务等技术,也需要借助各种协议来实现大型机器之间的协作。这里我列出了后面要讲的网络协议,后面我会按照从下往上的顺序讲。以上“双十一”的故事只是给大家一个大概的框架。里面有一些约定,我在故事里已经提到了,还有一些没有提到。希望对大家学习网络协议有所帮助!网络协议栈学习包(含视频、电子书、文档)【注:网络协议】