文章目录
- 1. OSI 参考模型和TCP/IP模型图例
- 2. 举例理解OSI参考模型
-
- 3. OSI参考模型简介
- 4. OSI参考模型的分层
- 5. 对等通信
- 6. 封装与解封装
- 7. TCP/IP
-
- 7.1 TCP/IP简介
- 7.2 数据包
- 7.3 传输层中的 TCP 和 UDP
- 7.3.1 端口号
- 7.4 UDP
- 7.5 TCP
-
- 7.5.1 三次握手(建立连接)
- 7.5.2 四次挥手(断开连接)
1. OSI 参考模型和TCP/IP模型图例
2. 举例理解OSI参考模型
2.1 案例1
网购的流程
一件货物通过以上步骤到达客户手中,我们可以把上面的每一步理解为OSI模型中的每一层,这样分层有很多好处。
2.2 案例2
应用程序QQ
分层的好处
3. OSI参考模型简介
OSI(Open System Interconnect),即开放式系统互连。 一般都叫OSI参考模型,是ISO(国际标准化组织)在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架,即OSI开放系统互连参考模型。
OSI参考模型的初衷是为了实现网络的普及,基本思路就是让所有公司都来使用该模型,这样就能实现不同厂商的网络设备能够互连互通,同时也方便了大家的学习和理解。
4. OSI参考模型的分层
与货物运输分层对比
OSI参考模型每一层的作用
应用层: 为操作系统或者网络应用程序之间提供通信,包括文件传输、电子邮件、远程登录等协议。
表示层: 数据格式转换和加/解密,将来自下层的数据转换成上层能够识别的格式。
会话层: 建立、管理、维护通信连接。
传输层: 以段为基本单位,建立通信节点间的连接。
网络层: 以分组为基本单位,负责寻址和路由选择。
数据链路层: 以帧为基本单位,负责物理层上的互联、节点之间的通信传输,例如与1个以太网相连的2个节点之间的通信。将0、1序列划分为具有意义的数据帧传送给对端(数据帧的生成与接收)。
物理层: 以比特(bit)为基本单位,负责0、1比特流(0、1序列)与电压的高低、光的闪灭之间的互换。
5. 对等通信
源主机OSI模型的每一层都必须与目标端对应的每一层进行通信,下一层为上一层提供服务。
6. 封装与解封装
七层的通信过程其实就是封装与解封装的一个过程。
7. TCP/IP
7.1 TCP/IP简介
从字面意义上讲,TCP/IP 是指 TCP 和 IP 两种协议。实际操作中有时也确实就是指这两种协议。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分。TCP/IP 一词泛指这些协议,因此,有时也称 TCP/IP 为网际协议群。
互联网进行通信时,需要相应的网络协议,TCP/IP 原本就是为使用互联网而开发制定的协议族。因此,互联网的协议就是 TCP/IP,TCP/IP 就是互联网的协议。
7.2 数据包
包、帧、数据包、段、消息
- 包可以说是全能性术语
- 帧用于表示数据链路层中包的单位
- 数据包是 IP 和 UDP 等网络层以上的分层中包的单位
- 段是传输层数据包的单位
- 消息是指应用协议中数据的单位
每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。
数据包首部
由两部分组成:一部分是协议所要用到的首部,另一部分是上一层传过来的数据。
首部的结构由协议的具体规范详细定义。在数据包的首部,明确标明了协议应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。包首部就像协议的脸。
数据包处理流程:
以发送一个邮件为例
1)应用程序处理
首先应用程序会进行编码处理,这些编码相当于 OSI 的表示层功能;
编码转换后,邮件不一定马上被发送出去,这种何时建立通信连接何时发送数据的管理功能,相当于 OSI 的会话层功能。
2)TCP 模块的处理
TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要在应用层数据的前端附加一个 TCP 首部。
3)IP 模块的处理
IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部。IP 包生成后,参考路由控制表决定接受此 IP 包的路由或主机。
4)网络接口(以太网驱动)的处理
从 IP 传过来的 IP 包对于以太网来说就是数据。给这些数据附加上以太网首部并进行发送处理,生成的以太网数据包将通过物理层传输给接收端。
5)网络接口(以太网驱动)的处理
主机收到以太网包后,首先从以太网包首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。
如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如 IP、ARP 等。这里的例子则是 IP 。
6)IP 模块的处理
IP 模块接收到 数据后也做类似的处理。从包首部中判断此 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例子则是 TCP。
另外,对于有路由器的情况,接收端地址往往不是自己的地址,此时,需要借助路由控制表,在调查应该送往的主机或路由器之后再进行转发数据。
7)TCP 模块的处理
在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。
8)应用程序的处理
接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。
7.3 传输层中的 TCP 和 UDP
- TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。TCP 为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等众多功能。
- UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务
7.3.1 端口号
数据链路和 IP 中的地址,分别指的是 MAC 地址和 IP 地址。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。
根据端口号识别应用
一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。
通过 IP 地址、端口号、协议号进行通信识别
仅凭一个端口号识别一个通信肯定是不行的
通过端口号、IP地址、协议号进行通信识别
- ① 和② 的通信是在两台计算机上进行的。它们的目标端口号相同,都是80。这里可以根据源端口号加以区分
- ③ 和 ① 的目标端口号和源端口号完全相同,但它们各自的源 IP 地址不同
- 此外,当 IP 地址和端口号全都一样时,我们还可以通过协议号来区分(TCP 和 UDP)
端口号的确定
- 标准既定的端口号:这种方法也叫静态方法。它是指每个应用程序都有其指定的端口号。例如 HTTP、FTP、TELNET 等广为使用的应用协议中所使用的端口号就是固定的。这些端口号被称为知名端口号,分布在 0~1023 之间;除知名端口号之外,还有一些端口号被正式注册,它们分布在 1024~49151 之间,不过这些端口号可用于任何通信用途。
- 时序分配法:服务器有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。在这种方法下,客户端应用程序完全可以不用自己设置端口号,而全权交给操作系统进行分配。动态分配的端口号范围在 49152~65535 之间。
端口号与协议
- 端口号由其使用的传输层协议决定。因此,不同的传输层协议可以使用相同的端口号。
- 此外,那些知名端口号与传输层协议并无关系。只要端口一致都将分配同一种应用程序进行处理。
7.4 UDP
- UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务
- 并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。即使是出现网络拥堵的情况,UDP 也无法进行流量控制等避免网络拥塞行为
- 此外,传输途中出现丢包,UDP 也不负责重发
- 甚至当包的到达顺序出现乱序时也没有纠正的功能
- 如果需要以上的细节控制,不得不交由采用 UDP 的应用程序去处理
- UDP 常用于一下几个方面:1.包总量较少的通信(DNS、SNMP等);2.视频、音频等多媒体通信(即时通信);3.限定于 LAN 等特定网络中的应用通信;4.广播通信(广播、多播)
7.5 TCP
- TCP 与 UDP 的区别相当大。它充分地实现了数据传输时各种控制功能,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在 UDP 中都没有
- 此外,TCP 作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费
- 根据 TCP 的这些机制,在 IP 这种无连接的网络上也能够实现高可靠性的通信( 主要通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现)
7.5.1 三次握手(建立连接)
- TCP 提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好两端之间的准备工作。
所谓三次握手是指建立一个 TCP 连接时需要客户端和服务器端总共发送三个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发。
- 第一次握手:客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
- 第二次握手:服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
- 第三次握手:客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
7.5.2 四次挥手(断开连接)
- 四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
- 由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
- 中断连接端可以是客户端,也可以是服务器端。
- 第一次挥手:客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说"我客户端没有数据要发给你了",但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。
- 第二次挥手:服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续等我的消息。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。
- 第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。
- 第四次挥手:客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。
参考链接
https://www.gameboys.cn/article/39
https://www.jianshu.com/p/9f3e879a4c9c