一、协议分层
一个协议层能够用软件、硬件或两者的结合来实现,网络协议以分层的方式组织协议以及实现这些协议的服务。应用层协议和运输层协议大多是在端系统中用软件实现,而物理层和数据链路层负责处理跨越特定链路的通信,它们通常在与给定链路相关联的网络接口卡(例如以太网 或WiFi接口卡)中实现,网络层经常是硬件和软件实现的混合体。
各层的协议被称为协议栈。因特网的协议栈有五个层次组成:物理层、链路层、网络层、运输层和应用层。而根据划分方式的不同,还可以将协议栈划分为七层或四层,如下图所示。
应用层
应用层包括网络应用程序及它们之间的网络协议。常见的应用层协议包括: HTTP(提供Web文档的请求和传送)、 SMTP(提供电子邮件报文的传送)、 FTP(提供不同端系统之间文件的传送)、 DNS(提供域名到32比特网络地址的转换服务)
应用层协议分布在不同端系统上,提供不同端系统上不同应用程序的信息传输服务。 应用层上传输的信息分组称为报文。
运输层
因特网的运输层中有两种运输层协议: UDP(提供无连接的、没有流量控制、拥塞控制的不可靠的传输服务) TCP(提供面向连接的、具有流量控制、拥塞控制的可靠的传输服务)
运输层在应用程序的端到端之间传送信息分组,运输层的信息分组称为报文段。
网络层
网络层主要包括网际协议IP,以及其他的一些路由选择协议,网络层也简单地被称之为IP层。
IP协议定义了数据包中的各个字段,所以具有网络层的因特网组件都必须运行IP协议。
网络层负责主机到主机之间的数据传输,这样的数据分组被称为数据报。
链路层
网络层为了将数据报从源运输到目的地,需要依靠链路层的服务。网络层将数据报下传给链路层,链路层沿着路径将数据报传递给下一个节点。在该下一个节点,链路层将数据报上传给网络层。
数据报从源到目的地传送通常需要经过几条链路,沿途会被不同的链路层协议处理,例如以太网、WiFi和电缆接入网的DOCSIS协议等。
链路层分组称为帧。
物理层
链路层的任务是将整个帧从一个网络元素移动到邻近的网络元素,而物理层的任务是将该帧中的一个个比特从一个节点移动到下一个节点。
该层的协议不仅与链路相关,还进一步地与链路的实际传输媒体相关(例如双绞铜线、单模光纤等)。
二、应用层
应用层协议(application-layer protocol 定义了运行在不同端系统上的应用程序进程如何相互传递报文。
- 定义了交换的报文类型,例如请求报文和响应报文。
- 各种报文类型的语法,如报文中的各个字段及这些字段是如何描述的。
- 字段的语义,即这些字段中的信息的含义。
- 确定一个进程何时以及如何发送报文,对报文进行响应的规则。
网络应用 与 应用层协议
应用层协议只是网络应用的一部分,例如: (1)Web应用是一种客户-服务器应用,它允许客户按照需求从Web服务器获得文档,它包括Web文档的格式标准(HTML)、Web浏览器(FireFox、Chrome)、Web服务器(Apache、Microsoft),以及应用层协议HTTP。
(2)因特网电子邮件应用也有很多组成部分,包括邮件服务器、读取和生成邮件的邮件客户程序(如Microsoft Outlook)、 定义电子邮件报文结构的标准、定义报文如何在服务器之间以及如何在服务器与邮件客户程序之间传递的应用层协议、定义如何对报文首部的内容进行解释的应用层协议SMTP。
。。。。。。。。。。。。待补充
三、运输层
运输层比较重要的协议主要就是TCP和UDP。说到这两种协议往往对比着来看,这二者有什么区别?——TCP是面向连接的,UDP是无连接的。
互通之前,面向连接的协议会先建立连接,也即TCP著名的三次握手,那为什么要建立连接呢?——建立连接是为了在客户端和服务端建立一定的数据结构来维护二者交互的状态。
TCP与UDP特性不同
(1)TCP提供可靠交付。通过TCP连接传输的数据,无差错、不丢失、不重复、并且按序到达。而下层的网络层IP包是没有任何可靠性保证的,一旦发出去,就像西天取经,走丢了、被妖怪吃了,都只能随它去。但是TCP能在不可靠的IP协议基础上尽可能地通过算法控制做到可靠性保障。而UDP继承了IP包的特性,不保证不丢失,不保证按顺序到达。
(2)TCP是面向字节流的,而IP是一个个IP包,从IP包到字节流,这是TCP自己所做的工作,而UDP继承了IP的特性,基于数据报,一个一个发,一个一个收。
(3)TCP是有拥塞控制机制的,当发生丢包活网络拥塞时,它会调整自己的传输速率。UDP是不会的。
(4)TCP是有状态的服务,记录了发送顺序,是否丢包等状态,而UDP是只管发,发出去就完事了。
UDP的特点: (1)沟通简单,不需要一肚子花花肠子(大量的数据结构、处理逻辑、包头字段)。前提是它相信网络世界是美好的,秉承性善论,相信网络通路默认就是很容易送达的,丢包、乱序、重传、拥塞都不会发生。 (2)轻信他人。它不会建立连接,虽然有端口号,但是监听在这个地方,谁都可以传给他数据,他也可以传给任何人数据,甚至可以同时传给多个人数据。 (3)愣头青,做事不懂权变。不知道什么时候该坚持,什么时候该退让。它不会根据网络的情况进行发包的拥塞控制,无论网络丢包丢成啥样了,它该怎么发还怎么发。
TCP与UDP应用场景不同
基于UDP特点,其使用场景如下: (1)需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。 (2)不需要一对一沟通,建立连接,而是可以广播的应用。UDP的不面向连接的功能,可以使得可以承载广播或者多播的协议。 (3)需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞,也毫不退缩,一往无前的时候。
TCP则与之相反。
UDP简单、处理速度快,不像TCP那样,操这么多的心,各种重传啊,保证顺序啊,前面的不收到,后面的没法处理啊。不然等这些事情做完了,时延早就上去了。 而TCP在网络不好出现丢包的时候,拥塞控制策略会主动的退缩,降低发送速度,这就相当于本来环境就差,还自断臂膀,用户本来就卡,这下更卡了。当前很多应用都是要求低时延的,它们可不想用TCP如此复杂的机制,而是想根据自己的场景,实现自己的可靠和连接保证。例如,如果应用自己觉得,有些包丢了就丢了,没必要重传了,就可以算了,有些比较重要的包,则应用自己重传,而不依赖于TCP。有的前面的包没到,后面的包到了,那就先给客户展示后面的嘛,干嘛非得等到齐了呢?如果网络不好,丢了包,那不能退缩啊,要尽快传啊,速度不能降下来啊,要挤占带宽,抢在客户失去耐心之前到达。
TCP与UDP报文段格式对比
TCP的报文段明显复杂得多。
除了必不可少的端口号外,TCP的报文段还多了包的序号,以此来确认包应该到达的顺序,以解决乱序的问题。 确认序号是为了确定发出的包对方是否收到,以此解决丢包的问题。 接下来是一些状态位。例如SYN是发起一个连接,ACK是回复,RST是重新连接,FIN是结束连接等。TCP是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。 接收窗口是通信双方各自声明的一个窗口大小,标识自己目前最大的处理能力,告知对方传送数据的最大限额,以此做到流量控制。 除了告知对方自己的处理能力,TCP也会根据对方的处理能力以及网络情况做拥塞控制,也即控制自己传送数据的速率。
通过对TCP头的解析,我们知道要掌握TCP协议,重点应该关注以下几个问题:
- 顺序问题,稳重不乱;
- 丢包问题,承诺靠谱;
- 连接维护,有始有终;
- 流量控制,把握分寸;
- 拥塞控制,知进知退。
TCP的三次握手
以上TCP所提供的服务保障,都要依赖于连接状态的维护,TCP连接的建立过程我们称之为三次握手。
为什么需要三次握手,而不是两次,按理来说,两个人打招呼,一来一回就可以了。如果是为了保证连接可靠,那为什么是三次,而不是更多?
A与B建立连接,首先需要保证双方的发信能力与收信能力均正常才能建立连接。A发信,B收到并回复A,那A收到B的回信后,此时知道了自己的发信能力和B的收信能力正常,所以B才会收到自己的信,而B的发信和自己的收信能力也正常,自己才能收到B发出的信,但此时B收到了A的第一封信,它只知道A的发信能力和自己的收信能力正常,并不知道自己的发信能力和A的收信能力是否正常,只有A收到B的回信后再发出第二封信,B才能确定自己的发信能力和A的收信能力也是正常的。
如此至少三次,这样的“请求——应答——应答之应答”过程,即可确保双方可以正式建立连接。
也可以简化理解为: A:你好,我是A B:你好A,我是B A:你好B
TCP的四次挥手
当A发出FIN报文,请求关闭连接时,它仅仅表示A没有数据再发送给B了。但未必此时B所有的数据都完整的发送给了A,所以B不会马上关闭SOCKET,它可能还需要发送一些数据给A后,再发送FIN报文给A,告诉主动方同意关闭连接。
也可以简化理解为: A:我所有东西都说完了 B:我已经全部听到了,但是等等我,我还没说完 B:好了,我已经说完了 A:好的,那我们的通信结束
|