四、协议分层的背景下,数据如何通过网络传输?
按照TCP / IP五层网络模型协议有五层:应用层、传输层、网络层、数据链路层、物理层。传输层为应用层提供服务,网络编程主要就是学习传输层和应用层交互。
4.1 再谈协议
对于客户端及服务器应用程序,请求(给服务器发送信息)和响应(服务器给予回应)需要约定一样的数据格式,方便(封装和分用,下文讲述)。
- 客户端发送请求和服务端解析请求要求使用相同的数据格式。
- 服务端返回响应和客户端解析响应请求要使用相同的数据格式。
- 请求格式和响应格式可以相同,也可以是不同的约定,保证发出请求的格式和解析请求的格式一样、响应的格式和解析响应的的格式一样即可,约定相同的数据格式,主要目的是为了让接收端在解析的时候明确如何解析数据。
- 可以使用知名协议,也可以自己约定数据格式,属于自定义协议。
4.2 封装 / 分用 vs 序列化 / 反序列化
协议(protocol),最终体现为在网络上传输的数据包的格式。
粗略的画个草图让大家先理解一下客户端服务器这种的通信流程:
编辑
我们每个人在使用qq 的时候,首先会联网,这样才能跟朋友愉快的聊天,其实这个联网的过程就是与腾讯qq 的服务器建立连接,当然腾讯有很多服务器,服务器之间可以进行信息交互,大家都连接上腾讯的服务器之后,这是qq 通信的基础,此时我们如果向好友qq发送信息,qq 应用层会生成一个应用层的数据报,里面的信息必然包括,你的qq ,对方的qq ,还有时间,信息体等信息,之后将数据交给传输层,传输层按照标准的网络协议保证将数据安全无误送给服务器,服务器读到你的请求之后,就会分析这个信息,看看是发给谁的,里面有 IP 地址(确认通信设备在互联网上的位置),端口号(相当于告诉这个信息是qq 发来的),以及qq 号, 腾讯的服务器依据对方qq 看看好友的 IP 设备连接上腾讯的服务器没有,如果没有就等待好友设备上线,如果刚好你朋友qq 上线了,就把消息根据拥有该账号设备的 IP地址,发给好友(同一时刻只允许一台通信设备-手机登录该qq,电脑是另一套逻辑),当然这是一串二进制数据,好友的设备接受到数据后,操作系统按照标准的网络通信协议解析,数据解析到达传输层的时候发现端口号描述的是 qq, 于是就将信息交给 qq 处理,qq 拿到信息之后按照 qq 这个应用开发者设计的消息约定,解析数据,最后消息就展现到好友的设备中了,由你发给好友的信息。
在以上流程中,传输的数据是以数据包的格式传输。
如果信息从应用层到物理层,层层协议会将程序中的对象层层打包,最终转化为二进制数,如果转化的过程中使用的是知名协议,例如 : 传输层的 UDP, TCP ,协议 网络层的 IP 协议,这个转化的过程被称之为封装,如果是使用的小众协议(包括自定义协议),这个转化过程就被称之为序列化。
接收端应用程序,接收数据时的数据转换,即对原始的二进制数进行解析,数据从物理层到应用层
如果是使用知名协议解析,这个解析也称为分用,如果是使用小众协议(包括自定义协议),这个动作也称为反序列化。
4.3 什么是端口号
端口号是计算机网络中用于标识应用程序的的数字。在一个主机上可以同时运行多个网络应用程序,每个应用程序都会分配一个唯一的端口号,以便于其他计算机通过网络访问该应用程序。
比如说我电脑qq 给 你发了一条消息,这个条消息通过网络发送到你的电脑,进入你的电脑后,这条消息怎么能知道要给那个应用程序呢(进程)?微信也是腾讯的,也没见着能接收qq 发的消息啊,关键的就是应用程序在启动时会绑定了一个端口号(端口号在一定范围内可以随机使用),一台主机中的端口号不可重复,所以消息在进入主机后就会根据端口号将信息发送到指定应用程序,应用程序就根据应用层的数据报协议(这个可以是通信双方约定的协议,qq自己的协议)解析信息。
端口号只占两个字节,可以描述的数据范围是 [0, 65535] ,也就是我们可以使用的端口号只有这么多,对于小于 1024 的端口号被称之为“知名端口号”,是提供给一些名气比较大的服务器使用,例如:HTTP 服务器的端口号位 80, SSH 的端口号为:22, FTP 服务器的端口号是 21。所以我们要在程序设计中尽量避免使用这部分端口。
下面是一些常用的端口号:
1.HTTP协议代理服务器常用端口号:80/8080/3128/8081/9098
2.SOCKS代理协议服务器常用端口号:1080
3.FTP(文件传输)协议代理服务器常用端口号:21
4.Telnet(远程登录)协议代理服务器常用端口号:23
HTTP服务器,默认端口号为80/tcp(木马Executor开放此端口)
HTTPS(securely transferring web pages)服务器,默认端口号为443/tcp 443/udp
Telnet(不安全的文本传送),默认端口号为23/tcp(木马Tiny Telnet Server所开放的端口)
FTP,默认的端口号为21/tcp(木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口)
TFTP(Trivial File Transfer Protocol),默认端口号为69/udp
SSH(安全登录)、SCP(文件传输)、端口号重定向,默认的端口号为22/tcp
SMTP Simple Mail Transfer Protocol(E-mail),默认端口号为25/tcp(木马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口)
POP3 Post Office Protocol(E-mail),默认端口号为110/tcp
Webshpere应用程序,默认端口号为9080
webshpere管理工具,默认端口号9090
JBOSS,默认端口号为8080
TOMCAT,默认端口号为8080
WIN2003远程登录,默认端口号为3389
Symantec AV/Filter for MSE,默认端口号为 8081
Oracle 数据库,默认的端口号为1521
ORACLE EMCTL,默认的端口号为1158
Oracle XDB(XML 数据库),默认的端口号为8080
Oracle XDB FTP服务,默认的端口号为2100
MS SQL*SERVER数据库server,默认的端口号为1433/tcp
MS SQL*SERVER数据库monitor,默认的端口号为1434/tcp
4.4 什么是 IP 地址
IP地址(Internet Protocol Address)的缩写,也就是互联网协议地址属于网络层的协议。它是用于在网络中唯一标识设备的一组数字,类似于门牌号码。IP地址的作用是让数据包能够在网络上正确地传输和路由到目的地。在互联网中,每个连接到网络上的设备都需要有一个唯一的IP地址,这样其他设备才可以通过该地址与其进行通信。IP地址由32位或128位二进制数字组成,可分为IPv4和IPv6两种格式。IPv4是目前广泛使用的版本,但随着网络连接设备的增多,IPv6逐渐取代IPv4成为新型的IP地址标准。
知道了地址才能找的到人家嘛,当前这是片面的理解,真实的理解是绑定了一个身份证号,在整个互联网中遍历寻找,找到你之后,网络层选择一条可靠的路径连接你。
4.5 一条信息的封装
发送方发送数据,要把数据从上到下(TCP / IP 网络模型),从应用层到物理层以此交给对应层次的协议进行封装。
以qq 发送消息为例:
张三使用qq 给 李四 发了一句 “早安” ;
1. 应用层(qq应用程序)拿到张三发送的信息 “早安”, 根据发送方和接收方的用户数据进行封装,封装成应用层数据包。
编辑
应用层数据报可以理解为就是一串字符串连在一起,可以使用一些特殊的符号区分,是可以自定义的协议。
2. 应用层到传输层 :使用 UDP 协议
传输层使用那种协议可以是应用层选择的,此处使用 UDP 协议举例:
应用层要调用传输层提供的接口来处理数据,在Java中,可以使用Java的原生套接字(Socket)API来操作UDP(用户数据报协议)。
//创建DatagramSocket对象来表示套接字:
DatagramSocket socket = new DatagramSocket();
UDP 协议会根据上述数据报进行封装——添加 UDP 报头。
编辑
传输层协议最重要的就是给应用层数据报添加源端口和目的端口,此时端口可以认为是代表qq,添加报头本质上还是字符串的拼接。
3. 传输层到网络层
网络层获取到 UDP 数据报后,会将其进行二次封装,添加 IP 协议报头,网络层最常见的协议就是 IP 协议。
编辑 编辑
源 IP 和 源端口号都是描述数据从哪里来。
目的 IP 和 目的端口号都是描述数据到哪里去。
4. 网络层到数据链路层
最典型的协议是——以太网 (数据链路层 + 物理层),同样也是会网络层数据报进行封装,也是字符串的拼接。 添加 以太网帧头,帧尾。
编辑
MAC地址是指 Media Access Control Address的缩写,又称为物理地址。它也是唯一的,可以理解为网卡的身份证。MAC地址是由6字节,48个二进制数表示的,通常用12个十六进制数表示。
MAC 地址诞生的原因跟 IP 地址一样,用于在计算机网络中识别设备,每个网络接口都有一个唯一的MAC地址,当年 IP 地址的创作者跟 MAC 地址的创作者是各自设计的,他们的目的是相同的,数据包能够在网络上正确地传输和路由到目的地。
MAC地址可以由网络设备生产商分配或者随机生成。在局域网中,当数据包从一个设备发送到另一个设备时,目标设备的MAC地址被用来确定数据包应该发送到哪个接口。
以太网数据帧尾(Ethernet frame trailer)是以太网数据帧的最后部分,它标志着该数据帧的结束。这个字段的长度是4个字节。数据帧尾包含两个字段:CRC和帧尾定界符(FCS)。CRC表示循环冗余校验码,用于检测数据帧是否受损;帧尾定界符是一个由16个1组成的特殊序列,用于告诉接收方数据帧的结束。
以太网数据帧尾是一个重要的组成部分,用于确保以太网数据帧能够正确地被发送和接收。
5. 数据链路层到物理层
到这里物理层要把从数据链路层传输过来的二进制数据转换成,光信号——光纤,电信号,电磁波信号等等进行传输。
上述过程除应用层以外,操作系统会自动帮我们封装好,封装好之后,自然是传输到各大运营商(移动联通啥的)的服务器上,我们联网的过程就是连接他们的服务器,访问服务器中的数据,服务器会根据我们请求的数据进行二次转发,以服务器为基准向目的主机发送(响应)信息,我们各个设备之间不属于网络直连的。
4.6 一条信息的分用
发送方发送数据,要把数据从下到上(TCP / IP 网络模型),从物理层到应用层以此交给对应层次的协议进行分用——解析。
设备接收信息刚好于上文反着来~~
1. 物理层设备、网卡接收到高低电平的信号
会接收到的信号进行解析,还原成二进制序列。
2. 物理层到数据链路层
当数据链路层接收到来自物理层的数据时,它会进行以下操作:
- 检查数据的完整性:数据链路层会检查数据是否有误码(parities)或差错,以确保数据传输过程中没有出现错误。
- 分帧:数据链路层会将接收到的比特流划分成数据帧,以便更好地进行管理和控制。
- 数据帧的序号确认:对于可靠传输的协议,数据链路层会确认已经正确接收到的数据帧的顺序和编号。
- 进行地址识别和转发:数据链路层会检查目标设备的地址,然后转发数据到目标设备或下一个跳点。
- 控制流量:如果必要的话,数据链路层会使用流量控制方法来限制数据的发送速率,以确保网络的稳定性和可靠性。
数据链路层负责管理和控制物理层传输的数据,确保成功的数据传输。
编辑
然后将数据帧提交给网络层。
3. 从数据链路层到网络层
当网络层从数据链路层接收到数据包时,会执行几个任务:
解封装:网络层将删除数据链路层头部和尾部,只留下IP头和有效载荷。
编辑
校验和验证:网络层将验证IP头的校验和,以确保头部没有错误。
路由:网络层检查IP头部的目标IP地址,并使用 IP 确定通过网络到达目标主机的最佳路径。
数据的传输不是单单直接从点 - 点的机制,而是中间有许多中转的设备。
完成这些任务后,网络层将数据包转发到适当的中转设备,以便将其传输到网络路由中的下一转发点,直到数据到达目标主机。
此时由网络层的 IP 协议对网络层数据报进行解析,去掉 IP 报头。
4. 从网络层到传输层
传输层在接收到网络层传递过来的数据时,会根据协议规定对数据进行相应的处理。其中最常见的是针对传输控制协议(TCP)和用户数据报协议(UDP)。因为数据报是由 UDP 协议封装的数据,所以解析的时候也应当使用 UDP 协议解析(分用)。
此时 UDP协议解析处理,凭借目的端口号来区分具体的应用程序(qq),每个联网的应用程序都需要关联一个端口号,然后去掉UDP 报头,取出荷载把数据交给应用层。
编辑 编辑
5. 传输层到应用层
数据在传输层的时候凭借端口号确定是那个应用程序接收(qq),所以此时由qq 这个应用程序解析数据。
编辑
此时如果这是一个字符串,相信大家有许多种方法能将字符串中的字段按照某种格式提取出来,有发送方,有接收方,有时间,有消息体,此时qq 就可以将解析的数据展示给用户界面。接收方qq的作用看似没用,实际在网络传输中用来确定,qq 服务器需要根据接收方的qq 找到入网登录的设备,这一点也是上文实例提到过的。
五、总结
两设备之间相互通信,发送方:层层封装,接收方:层层分用。
真实的网络环境中,数据的传输是非常复杂的,首先在整个互联网中确定主机IP 的位置就如同大海捞针,即使找到了,不见得有路线可以直达,所以数据的传输中间可能要经历很多节点的转发。
一台电脑入网,其入网设备会随机分配一个端口号,如果该电脑需要在网络上获取信息或发送信息,就需要使用一个外网 IP 地址,作为主机的“唯一”标识,在数据分层传输的时候会常常会使用中转的设备,例如:集线器,交换机,路由器,中继器等。
交换机:网络层设备
1. 将物理层的数据分用到数据链路层,过程中需要判断一下目的 MAC 是否准确,以及数据帧是否完整。
2. 交换机对数据链路层的数据进行封装,封装到物理层,继续转发数据。
路由器:网络层设备
1. 收到数据后会将数据直接从物理层分用(解析)到网络层,路由器属于网络层的设备,数据报在网络层会提供目的 IP 地址;,然后路由器根据目的 IP 进行下一阶段的寻址操作,IP 地址在一边传输的过程中,一边规划路径,此时源 IP 会被替换成该路由器的 IP 的地址,而原先的源 IP 地址会被路由器存储,新旧、源IP 之间形成映射关系,如果路由器进行下一阶段的寻址操作中发现前方道路无法到达目的 IP, 就会回头到 父节点,换一条路继续寻址。
2. 将拿到的传输层数据报从网络层封装到物理层,经过数据链路层的时候,也会调整 MAC 地址,数据到达这个目标主机,才会从物理层分用到应用层。
在网络通信中 ,以上叙述:二层和三层转发是两种不同路由的方式。
二层转发基于物理地址进行转发,也被称为MAC地址转发。当计算机在局域网内发送数据时,数据包会被发送到目标计算机的MAC地址上。这个过程不需要路由器的帮助,因为所有的设备都连接在同一个子网内。
三层转发则基于网络层协议,如IP地址,对数据包进行路由。当计算机发送数据包时,路由器根据目标地址将数据包传输到适当的网络。如果数据包需要跨越多个网络,则路由器将选择最佳路径进行转发。这个过程需要路由器的帮助,因为路由器可以为不同的网络提供连接。
二层转发适用于局域网内部的通信,而三层转发适用于不同网络之间的通信。
勇敢一点,我们不会比今天更年轻了。