精华内容
下载资源
问答
  • 物联网网络协议-MQTT协议的使用

    千次阅读 2021-02-15 12:29:03
    物联网系统中网络协议是物联网设备之间沟通“语言”,使用同一种语言,双方才能通信成功。MQTT 协议是最流行一种,它甚至已经成为物联网系统事实上网络协议标准。 第一步是安装 hbmqtt,它是一个开源基于 ...

    物联网网络协议-MQTT协议的使用

    非加密消息传输

    物联网系统中网络协议是物联网设备之间沟通的“语言”,使用同一种语言,双方才能通信成功。MQTT 协议是最流行的一种,它甚至已经成为物联网系统事实上的网络协议标准。

    第一步是安装 hbmqtt,它是一个开源的基于 Python 语言的 MQTT Broker 软件,正好包括我们需要使用一些工具。hbmqtt通过打开终端输入 pip 命令就可以安装。这也是选择使用它的主要原因。
    不过要注意的是,hbmqtt 是基于 Python3 实现的,因此这里使用的是 pip3 工具。

    pip3 install hbmqtt
    

    安装完成后,我们就可以使用 hbmqtt 中提供的 hbmqtt_sub 和 hbmqtt_pub 这两个命令行工具了。通过名字,你应该也可以看出 hbmqtt_sub 可以充当订阅者的角色;hbmqtt_pub 可以作为消息的发布者。
    至于订阅者和发布者之间的经纪人,也就是 MQTT Broker,我们使用 Eclipse 免费开放的在线 Broker 服务。
    链接: link.
    打开链接,你可以看到关于端口的介绍信息,加密和非加密方式都支持,而且还有基于 Websocket 的实现,这对基于前端网页的应用来说是非常有利的。
    我们先使用 1883 端口的非加密方式,然后为消息传输确定一个主题(Topic)。主题确定了消息的类别,用于消息过滤。我们可以把主题可以设为“/geektime/iot”。

    /geektime/iot
    

    接着,我们在电脑的终端界面输入下面的命令,就可以订阅这个主题消息:

    hbmqtt_sub --url mqtt://mqtt.eclipse.org:1883 -t /geektime/iot
    

    如果你想了解一些命令的执行细节,可以在上面的命令中加上 “-d” 参数。
    现在,我们启动另外一个终端界面,通过 hbmqtt_pub 发布一个 “/geektime/iot” 主题的消息:

    hbmqtt_pub --url mqtt://mqtt.eclipse.org:1883 -t /geektime/iot -m Hello,World!
    

    通过 Eclipse 的开放 Broker 作为“经纪人”,消息被传输到了我们通过 hbmqtt_sub 运行的订阅者那里。下图是终端界面上运行的结果,一个完整的消息传输过程就这样完成了。
    在这里插入图片描述

    MQTT 在物联网领域的优势

    MQTT 的生态很完善

    在使用 MQTT 的时候会觉得很方便,可供挑选的方案有很多,可以支持多种语言。类似的 MQTT Broker 软件,你还可以选择基于 C 语言的Mosquitto,基于 Erlang 语言的VerneMQ等。
    至于 MQTT 的客户端(Client)实现,也有成熟的 Python、C、Java 和 JavaScript 等各种编程语言的开源实现。
    而且,还有很多商业公司在持续运营功能更丰富、支持更完备的商业版 Broker 实现,比如提供高并发能力的集群特性、方便拓展的插件机制等。这些会大大提高我们技术开发者的工作效率。

    MQTT 自身的“基因”很强大

    阿里云、华为云、腾讯云和微软 Azure 这些大厂,之所以不约而同地选择 MQTT 协议作为物联网设备的“第一语言”,不仅是因为 MQTT 的生态完善,MQTT 协议本身的优秀设计也是重要的因素。
    它在设计上的优点体现在主要有五个方面:
    1.契合物联网大部分应用场景的发布 - 订阅模式。
    2.能够满足物联网中资源受限设备需要的轻量级特性。
    3.时刻关注物联网设备低功耗需求的优化设计。
    4.针对物联网中多变的网络环境提供的多种服务质量等级。
    5.支持在物联网应用中越来越被重视的数据安全。

    发布 - 订阅模式

    刚才通信过程,是一个发布者和一个订阅者的情况。在这之后,你可以再打开一个终端界面,重复和之前一样的命令,再启动一个订阅者。

    hbmqtt_sub --url mqtt://mqtt.eclipse.org:1883 -t /geektime/iot
    

    现在,这两个订阅者都订阅了“/geektime/iot” 主题的消息。
    然后,你再次使用 hbmqtt_pub 发送消息,就可以看到两个订阅者都收到了同样的消息,这是发布 - 订阅模式的典型特征。

    因为采用了发布 - 订阅模式,MQTT 协议具有很多优点,
    比如能让一个传感器数据触发一系列动作;
    网络不稳定造成的临时离线不会影响工作;
    方便根据需求动态调整系统规模等。
    这使得它能满足绝大部分物联网场景的需求。

    轻量级协议:减少传输数据量

    MQTT 是一个轻量级的网络协议,这一点也是它在物联网系统中流行的重要原因。毕竟物联网中大量的都是计算资源有限、网络带宽低的设备。
    这种“轻量级”体现在两个方面。
    一方面,MQTT 消息采用二进制的编码格式,而不是 HTTP 协议那样的文本的表述方式。
    这样子做的好处就是可以充分利用字节位,协议头可以很紧凑,从而尽量减少需要通过网络传输的数据量。
    比如,分析 HTTP 的一个请求抓包,它的消息内容是下面这样的(注意:空格和回车、换行符都是消息的组成部分):

    GET /account HTTP/1.1    <--注释:HTTP请求行
    Host: time.geekbang.com  <--注释:以下为HTTP请求头部
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:81.0) Gecko/20100101 Firefox/81.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
         <--注释:这个空行是必须的,即使下面的请求体是空的
    

    在 HTTP 协议传输的这段文本中,每个字符都要占用 1 个字节。而如果使用 MQTT 协议,一个字节就可以表示很多内容。下面的图片展示了 MQTT 的固定头的格式,这个固定头只有 2 个字节:
    在这里插入图片描述

    第一个字节分成了高 4 位(4~7)和低 4 位(0~3);低 4 位是数据包标识位,其中的每一比特位又可以表示不同的含义;高 4 位是不同数据包类型的标识位。
    第二个字节表示数据包头部和消息体的字节共个数,其中最高位表示有没有第三字节存在,来和第二个字节一起表示字节共个数。
    如果有第三个字节,那它的最高位表示是否有第四个字节,来和第二个字节、第三个字节一起表示字节总个数。依此类推,还可能有第四个字节、第五个字节,不过这个表示可变头部和消息体的字节个数的部分,最多也只能到第五个字节,所以可以表示的最大数据包长度有 256MB。
    比如,一个请求建立连接的 CONNECT 类型数据包,头部需要 14 个字节;发布消息的 PUBLISH 类型数据包头部只有 2~4 个字节。
    轻量级的另一方面,体现在消息的具体交互流程设计非常简单,所以 MQTT 的交互消息类型也非常少。为了方便后面的讲解,我在这里整理了一个表格,总结了 MQTT 不同的数据包类型的功能和发消息的流向。
    从表格可以看出,MQTT 3.1.1 版本一共定义了 14 种数据包的类型,在第一个字节的高 4 位中分别对应从 1 到 14 的数值。

    在这里插入图片描述

    功耗优化:节约电量和网络资源

    除了让协议足够轻量,MQTT 协议还很注重低功耗的优化设计,这主要体现在对能耗和通信次数的优化。
    比如,MQTT 协议有一个 Keepalive 机制。它的作用是,在 Client 和 Broker 的连接中断时,让双方能及时发现,并重新建立 MQTT 连接,保证主题消息的可靠传输。
    这个机制工作的原理是:Client 和 Broker 都基于 Keepalive 确定的时间长度,来判断一段时间内是否有消息在双方之间传输。这个 Keepalive 时间长度是在 Client 建立连接时设置的,如果超出这个时间长度,双方没有收到新的数据包,那么就判定连接断开。

    除了 Keepalive 机制,MQTT 5.0 中的重复主题特性也能帮助我们节省网络资源。
    Client 在重复发送一个主题的消息时,可以从第二次开始,将主题名长度设置为 0,这样 Broker 会自动按照上次的主题来处理消息。这种情况对传感器设备来说十分常见,所以这个特性在工作中很有实际意义。

    3 种 QoS 级别:可靠通信
    除了计算资源有限、网络带宽低,物联网设备还经常遇到网络环境不稳定的问题,尤其是在移动通信、卫星通信这样的场景下。比如共享单车,如果用户已经锁车的这个消息,不能可靠地上传到服务器,那么计费就会出现错误,结果引起用户的抱怨。这样怎么应对呢?
    这个问题产生的背景就是不稳定的通信条件,所以 MQTT 协议设计了 3 种不同的 QoS (Quality of Service,服务质量)级别。你可以根据场景灵活选择,在不同环境下保证通信是可靠的。
    这 3 种级别分别是:
    QoS 0,表示消息最多收到一次,即消息可能丢失,但是不会重复。
    QoS 1,表示消息至少收到一次,即消息保证送达,但是可能重复。
    QoS 2,表示消息只会收到一次,即消息有且只有一次。

    在这里插入图片描述

    我用一张图展示了它们各自的特点。可以看到,QoS 0 和 QoS 1 的流程相对比较简单;而 QoS 2 为了保证有且只有一次的可靠传输,流程相对复杂些。
    正常情况下,QoS 2 有 PUBLISH、PUBREC、PUBREL 和 PUBCOMP 4 次交互。
    至于“不正常的情况”,发送方就需要重复发送消息。比如一段时间内没有收到 PUBREC 消息,就需要再次发送 PUBLISH 消息。不过要注意,这时要把消息中的 “重复”标识设置为 1,以便接收方能正确处理。同样地,如果没有收到 PUBCOMP 消息,发送方就需要再次发送 PUBREL 消息。

    安全传输

    说到安全传输,首先我们需要验证 Client 是否有权限接入 MQTT Broker。为了控制 Client 的接入,MQTT 提供了用户名 / 密码的机制。在建立连接过程中,它可以通过判断用户名和密码的正确性,来筛选有效连接请求。但是光靠这个机制,还不能保证网络通信过程中的数据安全。因为在明文传输的方式下,不止设备数据,甚至用户名和密码都可能被其他人从网络上截获而导致泄漏,于是其他人就可以伪装成合法的设备发送数据。
    所以还需要通信加密技术的支持。
    MQTT 协议支持 SSL/TLS 加密通信方式。采用 SSL/TLS 加密之后,MQTT 将转换为 MQTTS。这有点类似于 HTTP 和 HTTPS 的关系。
    我们只要将前面测试的命令修改一下,将 “mqtt://” 改为 “mqtts://”,端口改为 8883,就可以用 SSL/TLS 加密通信方式连接到 Eclipse 提供的开放 Broker。
    如果这个的 SSL 证书已经过期了,连接会失败。
    这里再提供另一个方式,供测试使用)
    输入“mqtts://test.mosquitto.org:8883”,把开放 Broker 切换到这个链接,
    链接: link.
    从链接中下载一个客户端证书,然后通过下面的命令订阅主题消息:

    hbmqtt_sub --url mqtts://test.mosquitto.org:8883 -t /geektime/iot --ca-file ~/Downloads/mosquitto.org.crt

    接着,我们再通过下面的命令测试发布消息:

    hbmqtt_pub --url mqtts://test.mosquitto.org:8883 -t /geektime/iot -m Hello,World! --ca-file ~/Downloads/mosquitto.org.crt
    

    最后在运行 hbmqtt_sub 命令的终端,就可以看到 Hello,World! 的消息:

    在这里插入图片描述

    学习笔记总结自‘物联网开发实战’–郭朝斌
    –笔记只用于学习交流,请不要用于商业用途。

    展开全文
  • 机械设备租赁合同协议 工程机械设备租赁作为一类新型服务行业存在较强产品观念,营销管理工作简单低效将致使市场竞争手段单一,造成企业陷入发展瓶颈,今天小编给大家分享一下设备租赁合同,仅供阅读 机械设备...
  • 计算机网络 | 一文搞懂什么是TCP/IP协议

    万次阅读 多人点赞 2019-10-28 12:48:16
    计算机与网络设备之间如果要相互通信,双方就必须基于相同方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同硬件,操作系统之间通信,所有这一切都...

    什么是TCP/IP协议?

    计算机与网络设备之间如果要相互通信,双方就必须基于相同的方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同的硬件,操作系统之间的通信,所有这一切都需要一种规则.而我们就将这种规则称为协议 (protocol).

    image-20191027150025587

    也就是说,TCP/IP 是互联网相关各类协议族的总称。

    TCP/IP 的分层管理

    TCP/IP协议里最重要的一点就是分层。TCP/IP协议族按层次分别为 应用层,传输层,网络层,数据链路层,物理层。当然也有按不同的模型分为4层或者7层的。

    为什么要分层呢?

    把 TCP/IP 协议分层之后,如果后期某个地方设计修改,那么就无需全部替换,只需要将变动的层替换。而且从设计上来说,也变得简单了。处于应用层上的应用可以只考虑分派给自己的任务,而不需要弄清对方在地球上哪个地方,怎样传输,如果确保到达率等问题。

    image-20191027150352733

    如上图所示,我们将TCP/IP分为5层,越靠下越接近硬件。我们由下到上来了解一下这些分层。

    1. 物理层

      该层负责 比特流在节点之间的传输,即负责物理传输,这一层的协议既与链路有关,也与传输的介质有关。通俗来说就是把计算机连接起来的物理手段。

    2. 数据链路层

      控制网络层与物理层之间的通信,主要功能是保证物理线路上进行可靠的数据传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来移动数据结构的结构包,他不仅包含原始数据,还包含发送方和接收方的物理地址以及纠错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。如果在传达数据时,接收点检测到所传数据中有差错,就要通知发送方重发这一帧。

    3. 网络层

      决定如何将数据从发送方路由到接收方。网络层通过综合考虑发送优先权,网络拥塞程度,服务质量以及可选路由的花费等来决定从网络中的A节点到B节点的最佳途径。即建立主机到主机的通信。

    4. 传输层

      该层为两台主机上的应用程序提供端到端的通信。传输层有两个传输协议:TCP(传输控制协议)和 UDP(用户数据报协议)。其中,TCP是一个可靠的面向连接的协议,udp是不可靠的或者说无连接的协议

    5. 应用层

      应用程序收到传输层的数据后,接下来就要进行解读。解读必须事先规定好格式,而应用层就是规定应用程序的数据格式。主要的协议有:HTTP.FTP,Telent等。

    TCP与UDP

    TCP/UDP 都是传输层协议,但是两者具有不同的特效,同时也具有不同的应用场景。

    image-20191027212512703

    面向报文

    面向报文的传输方式是应用层交给UDP多长的报文,UDP发送多长的报文,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。

    面向字节流

    虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应该程序传送的数据块太长,TCP就可以把它划分短一些再传送。

    TCP的三次握手与四次挥手

    具体过程如下:

    • 第一次握手:建立连接。客户端发送连接请求报文段,并将syn(标记位)设置为1,Squence Number(数据包序号)(seq)为x,接下来等待服务端确认,客户端进入SYN_SENT状态(请求连接);

    • 第二次握手:服务端收到客户端的 SYN 报文段,对 SYN 报文段进行确认,设置 ack(确认号)为 x+1(即seq+1 ; 同时自己还要发送 SYN 请求信息,将 SYN 设置为1, seq为 y。服务端将上述所有信息放到 SYN+ACK 报文段中,一并发送给客户端,此时服务器进入 SYN_RECV状态。

      SYN_RECV是指,服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态。再进一步接收到客户端的ACK就进入ESTABLISHED状态。

    • 第三次握手:客户端收到服务端的 SYN+ACK(确认符) 报文段;然后将 ACK 设置为 y+1,向服务端发送ACK报文段,这个报文段发送完毕后,客户端和服务端都进入ESTABLISHED(连接成功)状态,完成TCP 的三次握手。

    上面的解释可能有点不好理解,用《图解HTTP》中的一副插图 帮助大家。

    img

    当客户端和服务端通过三次握手建立了 TCP 连接以后,当数据传送完毕,断开连接就需要进行TCP的四次挥手。其四次挥手如下所示:

    • 第一次挥手

      客户端设置seq和 ACK ,向服务器发送一个 FIN(终结)报文段。此时,客户端进入 FIN_WAIT_1 状态,表示客户端没有数据要发送给服务端了。

    • 第二次挥手

      服务端收到了客户端发送的 FIN 报文段,向客户端回了一个 ACK 报文段。

    • 第三次挥手

      服务端向客户端发送FIN 报文段,请求关闭连接,同时服务端进入 LAST_ACK 状态。

    • 第四次挥手

      客户端收到服务端发送的 FIN 报文段后,向服务端发送 ACK 报文段,然后客户端进入 TIME_WAIT 状态。服务端收到客户端的 ACK 报文段以后,就关闭连接。此时,客户端等待 2MSL(指一个片段在网络中最大的存活时间)后依然没有收到回复,则说明服务端已经正常关闭,这样客户端就可以关闭连接了。

    最后再看一下完整的过程:

    img

    如果有大量的连接,每次在连接,关闭都要经历三次握手,四次挥手,这显然会造成性能低下。因此。Http 有一种叫做 长连接(keepalive connections) 的机制。它可以在传输数据后仍保持连接,当客户端需要再次获取数据时,直接使用刚刚空闲下来的连接而无需再次握手。

    img

    一些问题汇总:

    1. 为什么要三次握手?

    为了防止已失效的连接请求报文突然又传送到了服务端,因为产生错误。

    具体解释: “已失效的连接请求报文段”产生情况:

    client 发出的第一个连接请求报文段并没有丢失,而是在某个网络节点长时间滞留,因此导致延误到连接释放以后的某个时间才到达 service。如果没有三次握手,那么此时server收到此失效的连接请求报文段,就误认为是 client再次发出的一个新的连接请求,于是向 client 发出确认报文段,同意建立连接,而此时 client 并没有发出建立连接的情况,因此并不会理会服务端的响应,而service将会一直等待client发送数据,因此就会导致这条连接线路白白浪费。

    如果此时变成两次挥手行不行?

    这个时候需要明白全双工与半双工,再进行回答。比如:

    • 第一次握手: A给B打电话说,你可以听到我说话吗?
    • 第二次握手: B收到了A的信息,然后对A说: 我可以听得到你说话啊,你能听得到我说话吗?
    • 第三次握手: A收到了B的信息,然后说可以的,我要给你发信息啦!

    在三次握手之后,A和B都能确定这么一件事: 我说的话,你能听到; 你说的话,我也能听到。 这样,就可以开始正常通信了,如果是两次,那将无法确定。

    2. 为什么要四次挥手?

    TCP 协议是一种面向连接,可靠,基于字节流的传输层通信协议。TCP 是全双工模式(同一时刻可以同时发送和接收),这就意味着,当主机1发出 FIN 报文段时,只是表示主机1已结没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回 ACK报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会中断这次TCP连接。

    3.为什么要等待 2MSL

    MSL:报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间

    原因如下:

    • 保证TCP协议的全双工连接能够可靠关闭
    • 保证这次连接的重复数据从网络中消息

    第一点: 如果主机1直接 关闭,由于IP协议的不可靠性或者其他网络原因,导致主机2没有收到主机1最后回复的 ACK。那么主机2就会在超时之后继续发送 FIN,此时由于主机1已经关闭,就找不到与重发的 FIN 对应的连接。所以,主机1 不是直接进入 关闭,而是TIME_WAIT 状态。当再次收到 FIN 的时候,能够保证对方收到 ACK ,最后正确关闭连接。

    第二点:如果主机1直接 关闭,然后又再向主机 2 发起一个新连接,我们不能保证这个新连接与刚才关闭的连接端口是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但还是有特殊情况出现;假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中( Lost Duplicate ),那些延迟数据在建立新连接之后才到达主机2,由于新连接和老连接的端口号是一样的,TCP 协议就认为哪个延迟的数据时属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接要在 TIME_WAIT 状态等待两倍 MSL ,保证本次连接的所有数据都从网络中消失。




    参考内容

    <图解HTTP>
    <Android进阶之光-网络篇>
    知乎-TCP 为什么是三次握手,而不是两次或四次?

    展开全文
  • 网络协议的初步认识

    2020-05-03 09:53:36
    计算机与网络设备要相互通信,双方就必须基于相同方法,比如哪边先发起通信,使用什么语言通信,通信状态等信息。所有这一切都要用一种规则统一起来,这种规则称之为协议。我们把协议的集合总称为TCP/IP 为了...

    一、TCP/IP协议族

    计算机与网络设备要相互通信,双方就必须基于相同的方法,比如哪边先发起通信,使用什么语言通信,通信状态等信息。所有的这一切都要用一种规则统一起来,这种规则称之为协议。我们把协议的集合总称为TCP/IP

    为了理解HTTP,我们有必要实现了解一下TCP/IP协议族(我们这里指的TCP/IP是指的所有协议族的统称,其中也包括了TCP和IP协议)

    • HTTP基于TCP/IP协议族,HTTP属于它内部的一个子集。
    • 把互联网相关联的协议集合起来总称TCP/IP。

     

    二、TCP/IP分层管理

    TCP/IP按层次分为4层:应用层,传输层,网络层和链路层。

    • 应用层:决定了向用户提供应用服务时通信的活动。
      • FTP(文件传输协议),DNS(域名系统),HTTP(超文本传输协议)
    • 传输层:提供处于网络连接中的两台计算机之间的数据传输。
      • TCP(传输控制协议),UDP(用户数据报协议)
    • 网络层(网络互联层):用来处理网络上流动的数据包。数据包是网络传输的最小单位。该层规定了通过怎样的路径到达对方计算机,并把数据包传送给对方。
    • 链路层(网络接口层):用来处理连接网络的硬件部分,包括控制操作系统、硬件的设备驱动、网卡、光纤等物理可见部分。

     

    三、与HTTP关系密切的协议:IP、TCP和DNS

    • IP协议:按层次分IP协议位于网络层,不要把IP协议和IP地址搞混了。IP协议的作用是将数据包传输给对方,两个重要条件:IP地址和MAC地址。
      • IP地址指明了节点被分配到到地址,MAC地址是指网卡所属固定地址。IP地址可以和MAC地址进行配对。IP地址可以变换,但MAC地址基本上不会更改。
    • ARP协议:网络上两台计算机进行通信,通常要经过多台计算机和网络设备中转才能连接到对方。在中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时采用ARP(地址解析协议),根据通信放的IP可以反查出对应MAC地址。

             

    •  TCP协议:TCP协议位于传输层。将大块数据分割以报文段为单位进行数据传输。确保数据能到达目标:TCP协议采用了三次握手

                

    1. 客户端发送SYN=1(表示请求连接),并发送一个seq(随机码)
    2. 服务器由于收到SYN=1,知道是请求连接,返回一个ACK=1(表示确认),并同返回一个请求连接SYN=1,然后返回一个ack=seq+1(客户端随机码应答),且自己也返回一个seq(随机码)
    3. 客户端收到服务器的ack后验证,向服务器确认包发送ack=seq+1(服务器随机码应答)
    4. 服务器确认ack后建立连接,完成三次握手。
    • 域名解析系统DNS:通过域名查找对应的IP地址,或通过IP查找域名

       

     

    四、各种协议与HTTP的关系图

     

    五、URI和URL

    • URI是Uniform Resource Identifier的缩写:意思是统一资源标识符。
      • Uniform:规定统一的格式可方便处理多种不同类型的资源。
      • Resource:可以被标识的任何东西(文档,图片,音乐,视频等),能够区别于其他类型的,全都可作为资源。资源不仅可以是单一的,也可以是多数的集合体。
      • Identifier:标识符。
      • 综上:URI就是由某个协议方案表示的资源的定位标识符。协议方案是指访问资源所使用的协议类型。
    • URL:统一资源定位符。(URI表示某一互联网资源,而URL表示资源的地点,可见URL是URI的子集)。
    • URI格式: 绝对URI,绝对URL,相对URL(从浏览器中基本URI处指定URL)。

    • 协议方案名:https,http等等
    • 登录信息:用于获取资源时必要的登陆信息(可选项)
    • 服务器地址:DNS可解析域名,IPv4地址,或者[0:0:0:0:0:0:0:1]这样的IPv6地址。
    • 服务器连接的网络端口号:不填则使用默认端口号(80)
    • 带层次的文件路径
    • 查询字符串
    • 片段标识符:已获取资源中的子资源
    展开全文
  • 计算机与网络设备要相互通信,双方就必须基于相同方法。如何探测到通信目标、由那一边现发起通信、使用哪种语言、使用那种操作系统、怎样结束通信等都需要事先确定。不同硬件、操作系统之间相互通信,所有这...

    TCP/IP协议族

    计算机与网络设备要相互通信,双方就必须基于相同的方法。如何探测到通信目标、由那一边现发起通信、使用哪种语言、使用那种操作系统、怎样结束通信等都需要事先确定。不同的硬件、操作系统之间的相互通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议。而与互联网相关联的协议集合起来总称为TCP/IP协议族。

    图:TCP/IP是互联网各类协议族的总称

    TCP/IP的分层管理

    TCP/IP协议族里最重要的一点就是分层。TCP/IP协议族暗层次可以氛围以下五层:应用层、传输层、网络层、数据链路层、实体层。

    图:TCP/IP的分层

    把TCP/IP层次化的好处有很多。比如,如果互联网只由一个协议统筹,某个地方需要改变设计时,就必须把所有部分整体替换掉。而分成之后只需把改变的曾替换掉即可。八个层之间的接口部分规划好之后,每个层次内部的设计就能够自由改动了。

    实体层

    实体层就是把电脑连接起来的物理手段,它主要规定了网络的一些电气特性。

    链接层

    用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。

    1.以太网协议

    早起的时候,每家公司都有自己的电信号分组方式。逐渐的,一种叫做以太网的协议,占据了主导地位。

    以太网协议规定,一组电信号构成一个数据包,叫做(frame)。每一帧分成两个部分:标头(Head)和数据(Data)。“标头”包含数据的一些说明项,比如发送者、接受者、数据类型等;“数据”则是发送的具体内容。

    图:数据包

    2.MAC地址

    以太网规定,如网设备,必须有网卡接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址就是数据包的发送地址和接收地址,被称为MAC地址。

    3.广播

    如何从一块网卡获知另一块网卡地址,首先采用的是一种ARP协议(Address Resolution Protocol)获取对应的MAC地址,然后以太网采用了一种很原始的方式,向所有的本网内所有计算机发送,让每台计算机自己判断对应的MAC地址是否与自己一样,如果一样,就接受这个包,做进一步处理,负责就丢弃这个包。这种发送方式就叫做广播(Broadcasting)。

    在同一局域网内,PC1发送的数据包以广播的形式进行发送,当匹配对象PC2接收到请求之后,就可以将PC1的IP和MAC映射信息存储在本地的【ARP缓存表】,既然知道PC1在哪里,就可以返回ARP单播回应包。

    网络层

    互联网是无数个子网络共同组成的一个巨型网络,如果在同一个子网络,就采用广播的方式发送,否则就采用路由方式发送。这就导致了网络层的诞生。他的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",简称"网址"。

    网络层用来处理在网络上流动的数据包。数据包是网络层传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据传送给对方。

    1.IP协议

    IP协议的作用是把各种数据包传送给对方。而要确保数据确实发送到对方哪里,则需要满足各类条件。其中最主要的条件是IP地址和MAC地址。IP地址指明了节点被分配到的地址,MAC是网卡所属的固定地址。 IP地址可更换,但MAC地址基本上不会更改。

    互联网上的每一台计算机,都会分配一个IP地址。这个地址分为两部分,前一部分代表网络,后一部分代表主机。判断两台计算机是否属于同一个子网络,需要用到另一个参数子网掩码,它是一个32位地址,它只有一个作用,就是将某个IP地址划分成网络地址主机地址两部分,如果两台电脑的网络地址部分相同,则可以判定他们在同一个子网络。

    2.ARP协议

    IP间的通信依赖MAC地址。在网络上,通信双方不在同一局域网内,事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的"网关"(gateway),让网关去处理。而在同一局域网内,我们可以使用ARP协议(Address Resolution Protocol),获取对方的MAC地址。ARP是一种用以解析地址的协议,根据通信方的IP地址就可以反查处对应的MAC地址。

    3.IMCP协议

    IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。当传送IP数据包发生错误——比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这也就是为什么说建立在IP层以上的协议是可能做到安全的原因。

    传输层

    传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。在同一个电脑中接收到发送给不同软件的数据包,则需要依靠端口(port)来区分是发给具体某个软件,它其实是一个网卡的程序编号。传输层的功能就是建立在“端口到端口”的通信。在传输层有两个性质不同的协议:TCP(Transmission Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。

    TCP协议

    tcp是一种面向连接的、可靠的、基于字节流的传输层通信协议。是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的,面向字节流。TCP协议将大快数据分割成报文段(segment)为单位的数据包进行管理,为了确保无误的将数据发送到目标处,TCP协议采用了三次握手(three-way handshaking)策略。握手中使用了TCP的标志(flag)-SYN(synchronize)、ACK(acknowledgement)和seq(sequence)。

     

    图:TCP数据发送流程图

    TCP三次握手过程

    第一次握手:客户端发送一个含有同步序列号的标志位给服务器请求建立连接,同时客户端进入SYN_SENT状态。发送报文的同时也启动一个定时器,等待服务器确认收到这个报文段,如果不能及时收到一个确认,将重新发送这个报文段。这次握手总共做了两件事:我要和你通信、你可以用seq=x作为起始数据段来回应我。

    第二次握手:服务端收到这个报文段,需要对报文段进行确认,设置ACK=x+1,seq=y,让客户端以这个序列号作为起始数据段来进行回应,这时服务器进入SYN_RECV状态。这次握手总共做了两件事:你可以和我通信、你可以用seq=y作为起始数据段来回应我。

    第三次握手:客户端收到服务器的确认报文段,会先进性确认,如果收到的报文检验有差错,那么就会丢弃这个报文段,如果检验无误,则会对服务器进行回复,设置ACK=Y+1。这时客户端与服务端都进入ESTABLISHED状态,完成TCP三次握手。

    若握手过程中某个阶段莫名中断,TCP协议会再次以相同顺序发送相同的数据包。

    TCP四次分手

    第一次分手:当客户端完成数据传输后,会对服务器发送一个FIN报文段,客户端进入FIN_WAIT_1状态。表明数据发送结束。

    第二次分手:服务器收到客户端发送来的FIN报文段,会返回一个ACK报文段,ACK加一,客户端进入FIN_WAIT_2状态,意思就是我同意你的关闭请求。

    第三次分手:服务器向客户端发送FIN报文段,请求关闭连接, 服务器进入LAST_ACK状态。

    第四次分手:客户端收到服务器发送的FIN状态,会向服务器发送ACK报文段,ACK加一,客户端进入TIME_WAIT状态,服务器收到ACK报文段后,就关闭连接;此时,客户端等待2MSL后依然没有收到回复,则证明服务器已正常关闭,那好,客户端也可以关闭连接了。

    客户端应用程序的状态迁移图

    CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

    服务器的状态迁移图

    CLOSED->LISTEN->SYN_RECE->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

    UDP协议

    UDP 是一种面向无连接,且不可靠的协议,在通信过程中,它并不像 TCP 那样需要先建立一个连接,只要(目的地址,端口号,源地址,端口号)确定了,就可以直接发送信息报文,并且不需要确保服务端一定能收到或收到完整的数据。它仅仅提供了校验和机制来保障一个报文是否完整,若校验失败,则直接丢弃报文,不做任何处理。

    图:UDP Service-Client关系图

    TCP与UD片间的区别

    1、tcp是面向连接的,可靠性高;udp是无连接的,可靠性较低;

    2、由于tcp是连接的通信,需要有三次握手、重新确认等连接过程,会有延时,实时性差;同时过程复杂,也使其易于被攻击;而udp无连接,无建立连接的过程,因而实时性较强,也稍安全;

    3、在传输相同大小的数据时,tcp首部开销20字节;udp首部开销只有8个字节,tcp报头比udp复杂,故实际包含的用户数据较少。tcp无丢包,而udp有丢包(注:网速的提升导致现在丢包率很低),故tcp开销大,udp开销较小;

    4、每条tcp连接只能是点到点的;udp支持一对一、一对多、多对一、多对多的交互通信。

    5、TCP对系统资源要求较多,UDP对系统资源要求较少

    采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大,基于UDP对实时性要求较为严格的情况下,采用自定义重传机制(注:UDP本身并不具有重传机制),能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。如果对实时性要求高和高速传输的场合下需要使用udp;如果需要传输大量数据且对可靠性要求高的情况下应该使用tcp;在可靠性要求较低,追求效率的情况下应该使用udp。

    应用层

    应用层决定了向用户提供应用服务时通信的活动。TCP/IP协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和DNS服务(Domain Name System,域名系统)服务就是其中两类。而HTTP协议也处于该层。

    DNS

    DNS(Domain Name System)服务提供了域名到IP地址之间的解析服务。计算机可以被赋予IP地址,也可以被赋予主机名和域名。比如www.18yk.com。我们通常使用主机名或者域名来访问对方的计算机,而不是直接通过IP地址访问。这就需要DNS服务来为我们将它们转换成IP地址,DNS协议通过域名的查找IP地址,会逆向从IP地址反差域名服务。

    图:DNS工作流程图

    HTTP协议

    HTTP(Hyper Text Transfer Protocol)超文本传输协议,是一种建立在TCP上的无状态连接,也是我们日常用的最多的一种协议。

    图:HTTP协议工作流程图

    URI

    URI(Uniform Resource Identifier)统一资源标识符,RFC2396分别对这 3 个单词进行了如下定义:

    Uniform :规定统一的格式可方便处理多种不同类型的资源, 而不用根据上下文环境来识别资源指定的访问方式。另外, 加入新增的协议方案(如http:或ftp:) 也更容易。

    Resource :资源的定义是可标识的任何东西。 除了文档文件、 图像或服务(例如当天的天气预报) 等能够区别于其他类型的, 全都可作为资源。 另外, 资源不仅可以是单一的, 也可以是多数的集合体。

    Identifier :表示可标识的对象。 也称为标识符。

    RFC3986列举了几种URI的常用语法格式:

    1.tp://ftp.is.co.za/rfc/rfc1808.txt

    2.http://www.ietf.org/rfc/rfc2396.txt

    3.ldap://[2001:db8::7]/c=GB?objectClass?one

    4.mailto:John.Doe@example.com

    5.news:comp.infosystems.www.servers.unix

    6.tel:+1-816-555-1212

    7.telnet://192.0.2.16:80/

    8.urn:oasis:names:specification:docbook:dtd:xml:4.1.2

    TCP/IP通信传输流

    利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收段则往应用层上走。以HTTP举例说明:

    发送端

    首先作为发送端的客户端在应用层(HTTP协议)发出一个想看某个Web页面的HTTP请求。为了传输方便,在传输层(TCP协议)把从应用层收到的数据(THTTP请求报文)进行分割,并根据各个报文上打上标记序号及端口号后转发给网络层。在网络层(IP协议),增加作为通信目的地的MAC地址后转送给链路层。这样一个网络通信请求就准备齐全了。

    接收端

    接受端的服务器在链路层接收到数据,按顺序往上层发送,一直到应用层。当传输到应用层才算真正接收到由客户端发送过来的HTTP请求。

    发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之。接收段在层与层传输数据时,每经过一层会把对应的首部消去。而这种把数据信息包装起来的做法被称为封装(encapsulate)。

     

    感言:到这里TCP/IP协议族就暂时告一乱落。写作的目的主要是最近在阅读《图解HTTP》这本书籍时产生了一些心的,并通过在网上查找相关资料进行整理总结,将之记录下来,与大家共享,也方便以后自己查阅。若其中有何错误漏洞,请大家不吝赐教。

    参考资料1:https://blog.csdn.net/u011957758/article/details/72353485

    参考资料2:https://www.jianshu.com/p/0cf648510bce

    参考资料3:http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

    展开全文
  • 工控系统中如果需要实现远程数据监控(SCADA)一定离不开通讯协议,SCADA系统中会使用经由双方约定的协议直接与下层设备或数据采集转换器进行数据通信。随着时代的发展,厂级监控的实时性、可靠性需求增高,工业...
  • 计算机与网络设备之间如果要相互通信,双方就必须基于相同方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同硬件,操作系统之间通信,所有这一切都...
  • 大白话HTTP/HTTPS协议

    2020-02-17 18:08:21
    在计算机中要与其他设备进行通信,双方就必须基于相同方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同硬件、操作系统之间通信,所有这...
  • http协议

    2019-04-15 12:11:14
    通过发送请求获取服务器资源web浏览器等,都可以叫做客户端(client) http是:hyper text transfer ...计算机与网络设备要相互通信,双方就必须基于相同的的方法,比如,如何探测到通信目标,由哪一边先发起通...
  • 计算机与网络设备要相互通信,双方就必须基于相同方式。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同硬件、操作系统之间通信,所有这一切...
  • 互联网协议

    2017-09-05 15:11:33
    计算机与网络设备要相互通信,双方就必须基于相同方法,比如如何探测到通信目标,由那一边先发起通信、使用哪种语言进行通信、怎样结束同行等规则都需要事先确定。不同硬件、操作系统之间通信,所有这一切...
  • http 协议

    2019-09-02 11:28:21
    计算机与网络设备之间互相通信,双方就必须基于同样方法。比如:如何发现通信目标、由谁发起通信、使用什么语言通信、怎么结束通信都需要事先确定,所有这些都需要一种规则, 这就是协议协议中存在多种内容;...
  • 计算机与网络设备要相互通信,双方就必须基于相同方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同硬件、操作系统之间通信,所有这一切...
  • TCP/IP协议协议分层详解

    千次阅读 2019-02-25 17:44:05
    计算机与网络设备要相互通信,双方就必须基于相同方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通 信、怎样结束通信等规则都需要事先确定。不同硬件、操作系统之间通信,所有这...
  • 计算机与网络设备要相互通信,双方就必须基于相同方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同硬件、操作系统之间通信,所有这一切...
  • 设备间想相互交流,通信双方必须使用同一种“语言”。比如说你和中国人问好说’你好‘、日本人问好要说‘こんにちは’、和英国人问好要说‘hello’. 说起网络协议,你可能马上想到了 HTTP 协议。是,在日常 ...
  • HTTP协议

    2020-05-18 14:26:04
    WWW概念:World Wide Web 万维网 一个大规模...计算机与网络设备要相互通讯,双方就必须基于相同方法。比如:如何探测到通讯目标、由哪一些先发起通信、使用哪种语言进行通信、怎么结束通信等规则都需要事先确定。
  • 计算机与网络设备之间如果要相互通信,双方就必须基于相同方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同硬件,操作系统之间通信,所有这一切都...
  • 一、TCP/IP网络模型计算机与网络设备要相互通信,双方就必须基于相同方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同硬件、操作系统之间...
  • 网络设备之间相互通信

    千次阅读 2018-08-01 14:09:06
    计算机与网络设备要相互通信,双方就必须基于相同方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同硬件、操作系统之间通信,所有这一切...
  • 计算机与网络设备之间如果要相互通信,双方就必须基于相同方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同硬件,操作系统之间通信,所有这一切都...
  • 图解HTTP协议笔记

    2020-12-15 23:01:21
    计算机与网络设备需要相互通信,双方就必须基于相同方法,也就是要遵循一定规则,这个规则就称为协议 包括诸如:TCP,IP,FTP,HTTP,UDP,DNS等等 TCP/IP分层有哪些 应用层、传输层、网络层、数据链路层 分层...
  • 概念1.TCP/IP 协议族计算机与网络设备要相互通信,双方就必须基于相同方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同硬件、操作系统之间...
  • 计算机与网络设备之间如果要相互通信,双方就必须基于相同方法.比如如何探测到通信目标.由哪一边先发起通信,使用哪种语言进行通信,怎样结束通信等规则都需要事先确定.不同硬件,操作系统之间通信,所有这一切都...
  • TCP/IP协议学习笔记

    2019-04-21 09:58:00
    网络设备之间需要相互通信,双方就需要基于相同方法。比如如何探测到对方设备、由哪一方先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。这些规则通常被称为协议(protocol)。 TCP/IP协议...
  • 一、TCP/IP网络模型计算机与网络设备要相互通信,双方就必须基于相同方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同硬件、操作系统之间...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 187
精华内容 74
关键字:

双方就设备使用的协议