OSI 七层模型(Open System Interconnect)即开放系统互连参考模型,是由 ISO(International Organization for Standardization)国际标准化组织提出的,用于计算机或通信系统间互联的标准体系
从上到下可分为七层:每一层都完成特定的功能,并为上一层提供服务,并使用下层所提供的服务
7、应用层(Application):为用户的应用程序提供网络服务
6、表示层(Presentation):将信息表示为一定形式和格式的数据流
5、会话层(Session):负责通信主机之间会话的建立、管理和拆除,协调通信双方的会话
4、传输层(Transport):负责通信主机间端到端的连接
3、网络层(Network):负责将分组从源机送到目的机,包括寻址和最优路径选择等
2、数据链路层(Data Link):提供可靠的帧传递,实现差错控制、流控等
1、物理层(Physical):提供透明的比特流(01流)传递
TCP/IP四层参考模型从上到下可分为四层:
4、应用层(Application):为用户提供所需要的各种服务
3、传输层(Transport):为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性
2、网际层(Internet):主要解决主机到主机的通信问题
1、网络接口层(Network Access):负责监视数据在主机和网络之间的交换
还有一种是五层协议的体系结构,是专门为介绍网络原理而设计的,与TCP/IP四层模型唯一不同的就是将网络接口层分为了数据链路层和物理层,在实际的应用中还是使用TCP/IP四层模型的
在实际的应用过程中,数据由发送方到接收方需要经过以下几个步骤:
数据在各层的形式叫 PDU(Protocol Data Unit)协议数据单元,其在各层有不同的名称
在OSI的 上三层,信息(应用层) 被表示为一定格式和形式的 数据流;
数据流被传到 传输层,将其切割为适合传输的 数据段,并加上段头,段头中包含定位应用进程的端口号等信息;
数据段传到 网络层,添加分组头部形成 分组,分组头部中包含寻址主机的IP地址和其他一些传输需要用到的信息;
分组再传到 数据链路层,添加帧头形成 帧,帧头中包含寻址主机所需的物理地址、校验等信息;
帧到了 物理层,被转成可供传输的 比特流。
TCP/IP 协议定义了计算机进行网络通信过程的一套处理标准,该标准定义了计算机在网络中如何发送数据、数据格式如何定义、发出消息后在网络中如何寻址找到目标计算机,最后目标计算机又如何检验收到消息的正确性、对数据拆解最后得到消息内容
TCP/IP协议族:
因为实现 TCP/IP 协议功能包括数据的发送、与硬件的交互、消息路由规则、格式定义、错误验证,每个功能有对应的协议规范,所以我们把这些协议统称为 TCP/IP 协议族
网络接口层:
主要是管理物理网络准备所需要的数据,包括
网际层:
网际层主要是解决数据由一个计算机的 IP 如何路由到目标计算机的过程规范,计算机消息发送出去后,是经过了哪些处理才能正确的找到目标计算机,其中包含了 IP、ARP、RARP、ICMP 等协议
MAC 地址
我们的消息如果要在网络中找到对应的目标计算机,那么我们的计算机一定要有一个唯一的地址标识才行,而能区分我们计算机唯一的标识就是我们的网络适配器地址,我们的网络适配器地址是由厂商生产时候就规定了一个复杂的英文串组成。
IP 地址
由于 MAC 地址是一段复杂的字串组成不利于我们计算机进行逻辑运算,而我们的消息要在网络中快速路由到目标计算机,那么就一定需要有一套逻辑运算的规则,,所以就有了 ARP 协议,ARP 协议规定了如何把 MAC 地址转换为可以用于逻辑运算的数字 IP 地址。
域名
因为 IP 地址过长不方便进行记忆,所以为了让用户更方便记忆所以衍生了 DNS 的服务,DNS 完成了把 IP 地址转为简单容易记忆的域名地址。
传输层:
传输层主要提供以下几个功能
应用层:
TCP/IP 的应用层对应于 OSI 的应用层、会话层、表示层,它们分别功能如下
TCP是一个面向连接的协议主要包括以下几个特性
滑动窗口协议有
a. 停等协议
滑动窗口的大小为1, 每个发送报文都要等到被确认以后,发送方才继续发送下一个报文。
b. 后退n步协议
该协议下,滑动窗口大于1,发送方可以一直发送报文,但是当接收到接收方发送的三个连续的同一序列号的 ACK 报文时,说明该序列号的报文是已经丢失的,那么此时重发该丢失报文以及该报文以后的报文(包括那些已经发送的)。
c. 选择重传
在后退 n 步协议当中,如果某个报文丢失,那么将要重新发送这个丢失报文及以后的所有报文(包括已经发送的),选择重传协议不用做此要求,只要重新发送丢失的报文即可。
1、UDP不面向连接。
2、只有有限的错误检验机制
3、不进行流量控制
因为 TCP 要进行额外的握手、挥手、数据检验、排序机制,所以 TCP 的速度要比 UDP 要慢,但是相较 UDP,TCP 已经做了比较完善的数据错误验证机制所以这样会省去应用层需要做的大量数据验证工作。
如果应用层对数据的校验不那么重视的话,可以使用性能上更优的 UDP,当然也可以使用 UDP 传输数据,数据校验的工作放到应用层来做也行,这就会加重开发的任务上。
对比:
TCP 面向连接(如打电话要先拨号建立连接); UDP是无连接的,即发送数据之前不需要建立连接。
TCP 提供可靠的服务,也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP 尽最大努力交付,即不保证可靠交付。
TCP 通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
UDP 具有较好的实时性,工作效率比 TCP 高,适用于对高速传输和实时性有较高的通信或广播通信。
每一条 TCP 连接只能是点到点的;UDP 支持一对一,一对多,多对一和多对多的交互通信。
TCP 对系统资源要求较多,UDP 对系统资源要求较少。
TCP 协议在确认客户端接收到完整的信息之后才会删除服务端操作系统中的缓存,否则就会继续发,这才是 TCP 协议的可靠性根本原因,而 UDP 只管发送数据而不管客户端有没有收到,所以就会造成丢包现象
随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP 协议以其简单、传输快的优势,在越来越多场景下取代了 TCP,如网页浏览、流媒体、实时游戏、物联网。
网速的提升给 UDP 稳定性提供可靠网络保障
网络环境变好,网络传输的延迟、稳定性也随之改善,UDP的丢包率低于5%,如果再使用应用层重传,能够完全确保传输的可靠性。
TCP 设计过于冗余,速度难以进一步提升
TCP 为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程以及重传策略。由于 TCP 内置在系统协议栈中,极难对其进行改进。
网页浏览
使用UDP协议有三个优点 :
流媒体
采用TCP,一旦发生丢包,TCP会将后续包缓存起来,等前面的包重传并接收到后再继续发送,延迟会越来越大。基于UDP的协议如WebRTC是极佳的选择。
实时游戏
对实时要求较为严格的情况下,采用自定义的可靠UDP协议,比如Enet、RakNet(用户有sony online game、minecraft)等,自定义重传策略,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响。
物联网
采用UDP有3个关键点:
三次握手的目的是为了建立可靠的通信信道,双方确认自己与对方的发送与接受功能正常
第一次握手:Client 什么都不能确认,Server 确认对方发送正常
第二次握手:Client 确认:自己发送、接收正常;Server 发送、接收正常。Server 确认:自己接收正常、Client 发送正常
第三次握手:Client 确认:自己发送、接收正常;Server 发送、接收正常。Server 确认:自己发送、接收正常;Client 发送、接收正常
所以,三次握手确认双方收发正常,缺一不可
三次握手的另外一个目的就是确认双方都支持TCP,告知对方用TCP传输
第一次握手:Server 猜测 Client 可能要建立 TCP 请求,但不确定,因为也可能是 Client 乱发了一个数据包给自己
第二次握手:通过 ack=J+1,Client 知道 Server 是支持 TCP 的,且理解了自己要建立 TCP 连接的意图
第三次握手:通过 ack=K+1,Server 知道 Client 是支持 TCP 的,且确实是要建立 TCP 连接
由于 TCP 连接是全双工的
因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个 FIN 来终止这一方向的连接,收到一个 FIN 只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个 TCP 连接上仍然能够发送数据,直到另一方向也发送了 FIN。
首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭
(1)第一次挥手:Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状态。
(2)第二次挥手:Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号+1(与 SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。
(3)第三次挥手:Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态。
(4)第四次挥手:Client 收到 FIN 后,Client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 Server,确认序号为收到序号+1,Server 进入 CLOSED 状态,完成四次挥手。
(全双工)根本原因是,一方发送 FIN 只表示自己发完了所有要发的数据,但还允许对方继续把没发完的数据发过来。
类比:
A和B打电话,通话即将结束后,A说“我没啥要说的了”,B回答“我知道了”,但是B可能还会有要说的话,A不能要求B跟着自己的节奏结束通话,于是B可能又巴拉巴拉说了一通,最后B说“我说完了”,A回答“知道了”,这样通话才算结束。