简述网络协议

来源:互联网 发布:人间喜剧 王祖蓝 知乎 编辑:程序博客网 时间:2024/06/05 17:55

先来两张图

协议的关系
这张图表明了协议之间的关系.
以下内容均来自csdn 和 chinaunix

  • 我们通过以上图片来了解一些概念的东西

    • 所谓的协议就是双方进行数据传输的一种格式, 或者说标准, 或者说规则.
    • 整个网络中使用的协议有很多,所幸的是每一种协议都有RFC文档
    • RFC: 是一系列以编号排定的文档,基本的因特网通讯协定都有在RFC文件内详细说明, 几乎所有的因特网标准都收录在RFC文件之中。在这里我们可以看到RFC那长长的定义列表,现在它一共有4000多个协议的定义,当然,我们所要学习的也就是那么十几个协议而已。

    • 通俗的解析: 为了解决不同电子设备之间的信息传递, 才会诞生协议

    • tcp/ip协议 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。

    • TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议簇。(简称TCP/IP协议)。里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等等.

    • TCP/IP协议簇按照层次由上到下,层层包装

      • 最上面的就是应用层了,这里面有http,ftp,等等我们熟悉的协议。
      • 而第二层则是传输层,著名的TCP和UDP协议就在这个层次
      • 第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据(后面会讲到)以确定传输的目标
      • 第四层是叫数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备
      • 再往下则是硬件层次了,负责网络的传输,这个层次的定义包括网线的制式,网卡的定义等等, 有些书并不把这个层次放在tcp/ip协议族里面,因为它几乎和tcp/ip协议的编写者没有任何的关系
    • 发送协议的主机从上自下将数据按照协议封装,而接收数据的主机则按照协议从得到的数据包解开,最后拿到需要的数据。这种结构非常有栈的味道,所以某些文章也把tcp/ip协议族称为tcp/ip协议栈
    • 互连网早期的时候,主机间的互连使用的是NCP协议。这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能。为了改善这种缺点,大牛弄出了TCP/IP协议。现在几乎所有的操作系统都实现了TCP/IP协议栈
  • 由下到上,只挑部分协议摘录(抄了一大堆,没保存结果…重新抄好累)

    • 链路层(略)
    • 网络层

      • IP协议
        是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输。要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制--这被认为是上层协议--TCP或UDP要做的事情。所以这也就出现了TCP是一个可靠的协议,而UDP就没有那么可靠的区别。(这是后话,暂且不提)

        值得注意的是, IP协议头里有个八位的TTL字段,这个字段规定该数据包在穿过多少个路由之后才会被抛弃(这里就体现出来IP协议包的不可靠性,它不保证数据被送达),某个ip数据包每穿过一个路由器,该数据包的TTL数值就会减少1,当该数据包的TTL成为零,它就会被自动抛弃。这个字段的最大值也就是255,也就是说一个协议包也就在路由器里面穿行255次就会被抛弃了,根据系统的不同,这个数字也不一样,一般是32或者是64,Tracerouter这个工具就是用这个原理工作的,tranceroute的-m选项要求最大值是255,也就是因为这个TTL在IP协议里面只有8bit。

        现在的ip版本号是4,所以也称作IPv4。现在还有IPv6。

      • ICMP协议

        前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。

        当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建立在IP层以上的协议是可能做到安全的原因。

    • 运输层
      运输层可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。

      • UDP协议
        UDP是运输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议。

        UDP端口号: 由于很多软件需要用到UDP协议,所以UDP协议必须通过某个标志用以区分不同的程序所需要的数据包。端口号的功能就在于此,例如某一个UDP程序A在系统中注册了3000端口,那么,以后从外面传进来的目的端口号为3000的UDP包都会交给该程序。端口号理论上可以有2^16这么多。因为它的长度是16个bit。

      • 终于看到了TCP协议
        TCP和UDP处在同一层—运输层,但是TCP和UDP最不同的地方是,TCP提供了一种可靠的数据传输服务,TCP是面向连接的,也就是说,利用TCP通信的两台主机首先要经历一个“拨打电话”的过程,等到通信准备结束才开始传输数据,最后结束通话。所以TCP要比UDP可靠的多,UDP是把数据直接发出去,而不管对方是不是在收信,就算是UDP无法送达,也不会产生ICMP差错报文。

      • TCP保证可靠性的简单工作原理

        1. 应用数据被分割成TCP认为最适合发送的数据块。
        2. 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能 及时收到一个确认,将重发这个报文段。
        3. 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。
        4. TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输 过程中的任何变化。如果收到段的检验和有差错, TCP将丢弃这个报文段和不确认收到此报文段(希望发送端超时并重发)。
        5. 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段 的到达也可能会失序。如果必要, TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
        6. TCP还能提供流量控制。
      • 可以看到
        TCP中保持可靠性的方式就是超时重发,这是有道理的,虽然TCP也可以用各种各样的ICMP报文来处理这些,但是这也不是可靠的,最可靠的方式就是只要不得到确认,就重新发送数据报,直到得到对方的确认为止

        TCP的首部和UDP首部一样,都有发送端口号和接收端口号。但是显然,TCP的首部信息要比UDP的多,可以看到,TCP协议提供了发送和确认所需要的所有必要的信息。

      • TCP连接的建立与中止

        1. 连接的建立(三次握手)

          • 客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
          • 服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
          • 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。连接建立后,客户端和服务器就可以开始进行数据传输了。
          • 理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求。
          • 建立连接和数据传输实例图, 前三次传输为三次握手, 之后再开始传输数据.
            这里写图片描述
        2. 结束连接(四次挥手)以客户端主动中断为例

          • 先是客户端发送FIN报文,也就是告诉服务端,客户端的事情做完了,没有数据要传输给服务端,所以要中断连接了
          • 但这个时候还不断开连接,因为服务端可能还有事情没做完,仍要继续向客户端发送数据
          • 所以服务端会先向客户端发ACK报文,也就是说服务器确认收到了客户端要断开连接的请求
          • 客户端收到服务端返回确认消息后,就会进入等待断开连接的状态
          • 在客户端等待服务端断开连接的过程中,服务端继续向客户端发送数据,当服务端确定数据发送完成了,就会向客户端发送FIN报文 , 就是说告诉客户端,我这边的事情也干完了 , 已经准备好断开连接了
          • 客户端收到FIN报文后,就知道可以断开连接了,但因为客户端不相信网络的原则,于是在向服务端发送ACK后不直接关闭连接,而是进入延时等待的状态
          • 服务端收到ACK后就可以关闭连接了,而客户端在延时等待到时间后还没有收到服务端的回复,就证明服务端已经正常关闭连接,这时客户端就也可以把连接关闭了。
          • 简单来说,就是FIN,ACK,FIN,ACK
      • TCP和UDP的区别

        1. TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性
          而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。

        2. 也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。

        3. 知道了TCP和UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的 , 因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的 , 即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”而实现了TCP所无法达到的传输效率。

接下来重点介绍应用层HTTP与Socket编程

socket

来源httptcpsocket

  • HTTP概念:
    HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础, HTTP协议是建立在TCP协议之上的一种应用(应用层, 主要解决如何包装数据)。

    HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

    • 在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
    • 在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。

    由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。

  • 端口(Port)概念

    我们要认识传输层中另一个重要的标记——Port(端口包含很多种类,这里特指协议端口)

    在Internet上,各主机间通过TCP/IP协议发送和接收数据包,各个数据包根据其目的主机的ip地址来进行互联网络中的路由选择,把数据包顺利的传送到目的主机。大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据包传送给众多同时运行的进程中的哪一个呢?显然这个问题有待解决,端口机制便由此被引入进来。

    本地操作系统会给那些有需求的进程分配协议端口(protocol port,即我们常说的端口),每个协议端口由一个正整数标识,如:80,139,445,等等。当目的主机接收到数据包后,将根据报文首部的目的端口号,把数据发送到相应端口,而与此端口相对应的那个进程将会领取数据并等待下一组数据的到来。

  • 套接字(socket)概念:
    单词为”插座”的意思, 是支持TCP/IP协议的网络通信的基本操作单元。
    传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议, 它只是提供了一个针对TCP或者UDP编程的接口。实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API) , 通过Socket,我们才能使用TCP/IP协议。Socket跟TCP/IP协议没有必然的联系 , Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象。
    socket的使用我们在下一章单独介绍
0 0
原创粉丝点击