首先,协议,能够理解为是一套统一的规则,就像行业标准。因为互联网主要的功能是传输信息,因此其协议通常是管理系统之间如何相互通讯的规则。缓存
用邮政和物流等线下的“运输协议”来理解,咱们之前写信的时候都须要写邮编、寄信人、收信人和地址,在途中邮政也有自身的标准,好比不一样地区的邮递员收集特定地区的邮件,而后聚集分发;物流行业也有集装箱、铁轨等。安全
在互联网通讯中,“如何探测到通讯目标、由哪一边先发起通讯、使用哪一种语言进行通讯、怎样结束通讯等规则都须要事先肯定。不一样的硬件、操做系统之间的通讯,全部的这一切都须要一种规则。”服务器
TCP/IP 协议的全称是 Transmission Control Protocol and Internet Protocol。TCP 和 IP 分别是两种协议;同时TCP/IP 协议能够指互联网 传输过程当中用到的一组协议族和互联网模型,由于 TCP 和 IP 在其中比较重要,因此以它们来命名。微信
因为通讯中涉及到的步骤和用到的软硬件不少,所以会被划分红不一样的层次。TCP/IP 模型有四个抽象的层次,描述了整体的设计大纲,并实现了网络通讯的具体协议。网络
这个模型中不一样的协议有着不一样的“分工”,掌握所须要的信息,而且根据特定信息完成它的工做,其实跟现实生活中工做流程差很少。再用上面邮政和寄快递的例子,因为存在分工,你问收件的快递员你的快递单到哪是他确定是不知道的,他只负责把你的快件送到快递集散点。测试
对于用户而言,能够把 TCP/IP 协议理解成快递公司,用户只须要寄件和签收,怎么把快件从 A 运到 B 手上,就是快递公司的事了。再次借用知乎哦吼的话:“TCP/IP 也是网络通讯里的物流公司,应用程序只要把须要传输的数据提交给 TCP/IP,TCP/IP 就能够把数据打包发到目的地,至于里面的传输细节应用程序也能够不关心,这样应用程序就能够从最底层的传输细节里解放出来,把更多的注意力放在应用程序数据自己的处理。”操作系统
接下来咱们能够开始来了解一下这家快递公司内部的各个重要角色。设计
这家公司大概能够分红四个部门,也就是 TCP/IP 协议族按层次分别分为应用层、传输层、网络层和网络接口层(数据链路层+物理层)。接口
先来个英文版three
再来个萌萌哒中文版
上面这幅图其实很形象地表现了整个数据传输的过程,咱们在微信上发一句话看似很简单,其实每一步都通过了从上层到底层,再从底层到上层应用的过程。好比小熊在微信上给小明发了一句消息,直到小明收到这个消息,其实就通过了上述过程。
微信所在的是应用层,它按照特定格式把数据打包好,加上收寄件人和双方地址、本身的 “记号”(以便到了小明那边知道这条消息是要给微信的)等等,给到传输层;传输层的 TCP 协议会把文件切成更小的碎片,确保数据包都被安全传输;网络(互连)层的 IP 协议会找到最佳路径;这个消息会经过光纤、WiFi 等网络发过去。到达目的地以后,被打散的数据会通过重组,传输层也会从记号知道这是给微信的。
上面这个过程其实已经聊到 TCP 协议和 IP 协议的主要做用,这两个分别是传输层和网络互连层最主要的协议,所以这个模型以它们来命名。具体过程当中会有不少其余协议,传不一样的数据时,应用层会有不一样的协议处理。感兴趣的宝宝能够继续跟我一块儿了解细节。
互联网中信息以数据包的单位传输,不一样的协议层对数据包有不一样的称谓,在传输层叫作段 (segment),在网络层叫作数据报 (datagram),在链路层叫作帧 (frame)。
发送端在层与层之间传输数据时,每通过一层时一定会被打上一个该层所属的首部信息,这种把数据信息包装起来的作法称为封装(encapsulate)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。 我会从最底层开始讲起。
常见协议: Ethernet 802.三、Token Ring 802.五、X.2五、Frame relay、HDLC、PPP ATM等。
又叫网络访问层(数据链接 + 物理层),负责从上层接收 IP 数据包并经过网络发送,或者从网络上接收物理帧,抽出 IP 数据包,交给 IP 层。这层包括主机链接到物理网络所须要的硬件以及传送数据的协议。好比路由、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分;这层的协议取决于所使用的物理网络。若是物理网络是 LAN,那么一般使用的是以太网(802.3)协议以及它的变体,若是使用的是 WAN,经常使用的则是点对点协议(PPP)以及帧中继等协议。
其中比较出名的是以太网协议。“两台电脑(主机)之间是经过网卡来进行发送和接收数据的。每一个网卡都有一个独特的地址,也就是 MAC 地址。以太网数据以帧为单位,包括标头和数据部分。以太网在子网内以广播的形式发送数据。光有 MAC 地址并不能让两台主机之间相互通讯,若是两台主机不在同一个子网,以太网协议就没辙了。这就要经过网络层来区分每台主机所在的网络是哪一个子网。若是在同一个子网,就用广播发送数据,不然就用路由发送。这就致使了网络层的诞生。”(来自极光推送)
常见协议:IP(Internet Protocol)、ICMP、ARP(Address Resolution Protocol)、RARP(Reverse ARP)。 IP 是网络层的核心,经过路由选择将下一条 IP 封装后交给接口层。 ICMP 是网络层的补充,能够回送报文。用来检测网络是否通畅。
网络层的主要任务简而言之就是“给每一个数据包肯定路线”。这个主机可能在同一个网络或者外部网络,所以须要先区分主机是否是在同一个子网。
这层就是 IP 协议所在的地方。就像咱们写信的时候须要有一个地址,在网络世界中也须要一个地址,这个网络地址就是 IP 地址。
IP 地址是门牌号,而 IP 协议负责计算并找到指定门牌,快递小哥天天出门前要作的事就是 IP 协议的天职:分拣包裹、规划路径。其实,三五个节点的小型网络内部通讯彻底没必要使用 IP 协议,由于这些节点之间原本就能两两互通,但会有个问题:节点数变多后,网速就会瘫痪,由于带宽耗尽。(带宽指固定时间内能传递的数据包,有点像马路宽度。)
所以,后来一片网络拆分红不少子网络(sub networks),每片子网络交给一台路由器统管。子网络中的节点间能够单独通讯,不须要 IP 协议,但因为带宽限制,若是你想和本网络外的节点沟通时,就得使用一个设备:路由器。世界上大多数的路由器被几家大运营商掌管。
如上图,节点 1 和 2 同属一个子网,可基于内部通讯协议沟通,而 1 和 5 间的联络必须基于 IP 协议,经过路由器 1 和 2 之间的路径交流。
把 IP 协议的逻辑推广到整个互联网,最终,链接咱们手机客户端和腾讯服务器的是无数个路由器。
把大网络切小的好处显而易见:节约带宽、抬高网速,同时一只路由器挂了不影响其余节点间的通讯,这就是 IP 协议的做用。
这层还有一些 “协助”IP 协议工做的协议,好比 ARP 和 RARP。要保证数据确实传送到对方主机,除了 IP 地址以外还须要 MAC 地址(Media Access Control Address)。Mac 地址又称物理地址,跟网卡一一对应,对于一台主机来讲是惟一且不可变的。IP 地址则是会根据你所在网络的不一样改变的。
上述两个协议的做用简单而言就是:用 IP 地址找 Mac 地址;以及用 Mac 地址找 IP 地址。具体的做用请看下面两段:
“ARP(地址解析协议)基本功能就是经过目标设备的 IP 地址,查询目标设备的 MAC 地址,以保证通讯的顺利进行。以太网中的数据帧从一个主机到达网内的另外一台主机是根据48位的以太网地址(硬件地址)来肯定接口的,而不是根据 32 位的 IP 地址。内核必须知道目的端的硬件地址才能发送数据。P2P 的链接是不须要 ARP 的。
RARP(反向地址转换协议)容许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。局域网网关路由器中存有一个表以映射 MAC 和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序须要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器。”
看完以后你可能跟我有同样的疑惑,既然都是靠物理地址找主机,为啥还须要 IP 地址?51CTO 和 CSDN 这两篇文章能够解答这个问题:
MAC 地址结构是酱紫的:一共有 48bit,分为两部分,前 24bit 是厂商代码,后 24bit 是厂家本身分配的。假如咱们认为 MAC 地址能够区分不一样的网络的话,那只能是使用厂商代码来区分不一样的网络,显然同品牌网卡不表明在同一个网络。
最先这个世界上的电脑没这么多的时候,是没有路由这个东西存在的,主机都在一张网里,因此确实是直接经过 mac 地址通讯的。最初的链路层协议是和 ip 地址无关的,没有网络层方面的设定,只有物理层和链路层,最初也只有集线器,没有交换机路由器,服务器之间传输数据全靠 mac 地址。在没有 ip 地址以前,mac 地址已经在使用了。如今处处都在用的二层交换机,就是根据 mac 地址转发数据。mac 地址的设计不携带设备在网络中的位置信息,想要经过 mac 地址通讯,咱们得在全部的设备上维护一张很大的表,记录全部 mac 地址路由在当前位置的的下一跳,这显然是不合理的。
再次用《图解 HTTP》里面萌萌哒图解释一下这个过程:
MAC 地址就像电脑的我的身份证,IP 地址就像电脑所在的屋子,屋子里能够住着不少人,局域网关路由就像登记人口的街道办公室。
有了 IP 协议,就能够在两个主机之间发送数据了,接下来的问题在于每台主机都有不一样的应用,如何区分哪一个数据包属于哪一个程序?这就是传输层的做用。传输层的主要任务是确保分割的单元在另外一端正确地到达,它创建端口到端口的链接。网络层创建主机到主机的链接,只要有主机和端口,就能肯定数据包属于哪一个程序的。同时它也负责接收应用层的数据,而后把它们分红更小的单元(标头和数据部分在网络层的数据部分),传输到网络层。
这里提到的端口不是硬件端口,而是软件端口,端口有点向外界信息进入电脑的门,不一样的信息经过这些门传给不一样应用程序。
“ip 能锁定一台物理机器,对应着一张网卡,外界发来的数据包网卡都会接收。可是问题来了,网卡给程序提供了接口,你监听一下我,要是有消息来了,我就转发给你。这样应用程序就能收到数据了。可是问题来了,程序 A 和程序 B 都须要监听网卡接发数据,网卡说那我把接到的数据都发给你两,大家本身看着办吧。好,小 A 小 B 都接受了。可是又来了 CDEF......,不行了,每一个包都被发到了全部应用程序,每一个应用程序都累得不行,最终垮了。
好,那网卡说我给大家加个表示吧,咱们之间能够用一个号码来做为标识,我和小 A 之间就用 1 来标识,若是外界发给 1 号标识的数据我就转发给你,你监听个人时候得告诉我你监听的时 1,我就转发 1 的数据包给你。好了其余的 BCD... 都本身弄一个标识号,只要不重复就行。这样你们都省事了。
最后设计到安全,一个标识号只能被一个应用程序监听,由于若是小 A 程序和小 B 同时监听一个标识号号,那就坏了,我传的数据都被 AB 接到,这样数据安全性就没办法保证了。”
这一层主要有两个协议:TCP 和 UDP。
TCP是一种面向链接的、可靠的、基于字节流的传输层通讯协议。UDP(用户数据报协议)是一种无链接的传输层协议,提供面向事务的简单不可靠信息传送服务。
这两句话虽然看起来也是让人懵逼,但大概能让人 get 到一个可靠一个没那么可靠。没错这就是二者的区别。
TCP 协议提到的所谓字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,可以把数据准确可靠地传给对方。简单来讲就是,它把数据切成一个个数据包,从第一只数据包开始传,传送成功就翻倍,发现失败就地爬起来,从绊倒的那只数据包从新开始,周而复始。(如下内容来自知乎用户陈宝佳和小明):
图片来自《图解HTTP》
为了准确无误地将数据送达目标处,在收发数据前,必须和对方创建可靠的链接。TCP 协议采用了三次握手(three-way handshaking)策略。握手过程当中使用了 TCP 的标志(flag) —— SYN(synchronize) 和 ACK(acknowledgement):
第一次握手:客户端发送 syn 包 (syn=j) 到服务器,并进入 SYN_SEND 状态,等待服务器确认;
第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时本身也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。
注意:握手过程当中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。除了上述三次握手,TCP 协议还有其余各类手段来保证通讯的可靠性。
理想状态下,TCP 链接一旦创建,在通讯双方中的任何一方主动关闭链接以前,TCP 链接都将被一直保持下去。
断开链接时服务器和客户端都可以主动发起断开 TCP 链接的请求,断开过程须要通过“四次握手”。
至于 UDP 协议,传送数据前并不与对方创建链接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,固然也不用重发,因此说 UDP 是无链接的、不可靠的一种数据传输协议。UDP 传输的信息包最小只有 8 个字节,TCP 则是 20 个字节。这样的好处是,UDP 对系统资源要求更低,开销更小,数据传输速率更高,由于没必要进行收发数据的确认,因此 UDP 的实时性更好。他还表示 MSN 采用 TCP 传输协议传文件,QQ 传输文件采用 UDP,因此后者更快。
我在学校的时候,有师兄教过我用 “ping” 命令来测试两台主机之间 TCP/IP 通讯是否正常。依然是据上面那个知乎大神解释,“其实 ping 命令的原理就是向对方主机发送 UDP 数据包,而后对方主机确认收到数据包, 若是数据包是否到达的消息及时反馈回来,那么网络就是通的。ping 命令是使用 IP 和网络控制信息协议 (ICMP),于是没有涉及到任何传输协议(UDP/TCP) 和应用程序。它发送 icmp 回送请求消息给目的主机。ICMP 协议规定:目的主机必须返回 ICMP 回送应答消息给源主机。若是源主机在必定时间内收到应答,则认为主机可达。”
应用层是互联网程序与其余程序通讯所使用的层,也是离用户“最近”的一层。
好比说访问网页,确定要用到 HTTP,前面确定会有"HTTP://",这就是 HTTP 协议(超文本传输协议)(或者加上了"HTTPS://",这是安全的超文本传输协议)。1982 年春,美国国防部宣布 TCP/IP 做为军用网络的通讯标准。1989 年,Timothy Berners-Lee 研发出了超文本传输协议 HTTP,以后,互联网上能够传输的不只只有文字,还有包括图片等各类多媒体的网页。
咱们一般访问一个网页的的时候更习惯打域名,好比 https://www.badidu.com,而不会直接打IP(看我上面 ping 命令的截图,你会看到百度的 IP),由于这样更好记,但是电脑就不是这么想的,因此就须要 DNS(域名系统)。DNS 用于经过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。
若是要发邮件,就要用到SMTP(简单邮件传输协议);还有 FTP(文件传输协议),用于 Internet 上的控制文件的双向传输,同时也是一个应用程序;还有 Telnet,Internet 远程登录服务的标准协议和主要方式,能用户能够在一台电脑上远程控制另外一台电脑(你在 QQ 中大概用过)。
这一层的主要任务是将接收到的数据包按照协议解读成各类类型的数据,并将要发送的数据打包进传输层。主要协议有:HTTP、FTP、SMTP、Telnet、NFS、RIP 等等。