[关闭]
@boothsun 2018-01-02T09:33:02.000000Z 字数 7804 阅读 1113

网络基础知识复习

网络编程


  1. 参考原文:HTTP协议—— 简单认识TCP/IP协议
  2. 参考原文:计算机网络中的七层模型
  3. 参考原文:计算机网络协议层次
  4. 参看原文:TCP和UDP的区别(转)

什么是TCP/IP

如果要了解一个人,可以从他归属的集体聊起来。我们的HTTP协议就属于TCP/IP协议家族中的一员,了解HTTP协议再整个网络流程中的地位,也能更加充分的理解HTTP协议。

要想了解什么是TCP/IP协议,就要知道为什么有这个协议。中国人和中国人说话,要遵循汉语的的语法结构,使用汉语的发音。当我们和外国人交流时,就要适用外国的语言了,遵循外国的语法结构和发音。其实这就是一种协议,只不过我们称之为语言。计算机再这方面体现的更为直观,两台机器之间该如何通信呢,就需要制定各种各样的协议了。例如:文件传输适用TCP协议。域名系统适用DNS协议。有了些协议的存在,各种数据流按照规则传输,计算机之间得以通信。

TCP/IP协议是一个协议集合。大家叫的时候为了方便说,所以统称为TCP/IP。TCP/IP协议族中有一个重要的概念是分层,TCP/IP协议按照层次分为以下四层。应用层、传输层、网络层、数据链路层。为什么要分层?这就如同邓小平1978年的大包干,责任到人。一个层只负责一个层次的问题,如果出问题了,和其他的层次无关,只要维护这个层次也就好了。其实编程语言里也能体现这个分层理论,即封装性、隔离性。这里不再延伸细谈。下面我是制作的一个简图。

下面是从网络上找到的TCP/IP通信数据流


下面是我的补充:

具体协议与分层对应关系:

其他层次的划分:

OSI(Open System Interconnection 开放式互联系统):是由国际标准化组织(ISO)制定的OSI模型。

7层模型下每层的作用:

下面以5层模型为基础介绍每层作用:

应用层:

与应用程序和用户实实在在打交道的一层。我们在浏览器访问网页就是走http协议,发邮件就是SMTP(邮件传输协议),通过FTP工具上传下载文件就是FTP协议(文件传输协议),再比如我们修改hosts文件 就是在使用DNS域名协议。

应用层传输的信息叫做 报文。

数据传输层:

负责应用层与网络层之前的数据传输,向用户提供可靠的端到端的差错处理、流量控制和可靠性保证。对上,屏蔽网络层传输细节,向用户透明地传送数据报文(发送方:大报文切割成小的报文段分批发送,传送异常时的处理 比如重试等。 接收方接收到数据后的:重新装包拼接 然后发送给上游应用层等操作)。在这一层主要有 TCP协议(Transmission Control Protocol 传输控制协议)和UDP(User Data Protocol 用户数据包协议)协议。

网络层:

其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。

一般地,数据链路层是解决同一网络内节点之间的通信,而网络层主要解决不同子网间的通信。例如在广域网之间通信时,必然会遇到路由(即两节点间可能有多条路径)选择问题。

  1. 选址:数据链路层中使用的物理地址(如MAC地址)仅解决子网络内部的寻址问题。在不同子网之间通信时,为了识别和找到网络中的设备,每一子网中的设备都会被分配一个唯一的地址。由于各子网使用的物理技术可能不同,因此这个地址应当是逻辑地址(如IP地址)。
  2. 最优路径选择:网络层会综合考虑发送优先级、网络阻塞程度、网络服务质量以及可选路由的时间花费来决定从一个网络节点到另一个网络节点的最佳路径。
  3. 连接服务:与数据链路层流量控制不同的是,前者控制的是网络相邻节点间的流量,后者控制的是从源节点到目的节点间的流量。其目的在于防止阻塞,并进行差错检测。

数据链路层:

数据链路层是为了解决路由器到你的电脑之间的地址选择,连接建立,差错控制等问题。

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

网络层通过源和目的地之间的一系列路由器路由数据报,为了将分组从一个结点移动到路径的下一个结点,网络层必须依靠链路层的服务。特别是在每个结点,网络层将数据报下传给链路层,链路层沿着路径将数据报传递给下一个结点,在下一个结点,链路层将数据报上传给网络层。
由链路层提供的服务取决于应用于该链路的特定的链路层协议,比如我们常见的以太网,WIFI等。
因为数据报从源到目的地传送通常要经过几条链路,一个数据报可能被沿途不同链路上的不同链路层协议处理。例如,一个数据报可能被一段链路上的以太网和下一段链路上的PPP所处理。网络层将受到来自每个不同链路的链路层协议的服务。

总而言之,数据链路层解决了不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。

物理层:

建立、维护、断开物理连接。(由底层网络定义协议)

主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

该层包括物理连网媒介,如电缆连线连接器。物理层的协议产生并检测电压以便发送和接收携带数据的信号。在你的桌面P C 上插入网络接口卡,你就建立了计算机连网的基础。换言之,你提供了一个物理层。尽管物理层不提供纠错服务,但它能够设定数据传输速率并监测数据出错率。网络物理问题,如电线断开,将影响物理层。   用户要传递信息就要利用一些物理媒体,如双绞线、同轴电缆等,但具体的物理媒体并不在OSI的7层之内,有人把物理媒体当做第0层,物理层的任务就是为它的上一层提供一个物理连接,以及它们的机械、电气、功能和过程特性。如规定使用电缆和接头的类型、传送信号的电压等。在这一层,数据还没有被组织,仅作为原始的位流或电气电压处理,单位是bit比特。

TCP(Transmission Control Protocol,传输控制协议)

TCP的特点

  1. 面向连接:
    数据传输之前 需要先通过三次挥手建立连接通道。
  2. 可靠的数据传输:
    • 发送应答机制:每次发送报文段,接收方收到数据后都会给以确认收到的响应(ACK)。(这也得益于TCP是面向连接的,所以数据传输过程中连接不会断开。UDP就不行了。)
    • 超时重传:发送端发出一个报文段之后就会启动定时器,如果在定时时间内没有收到应答就会重发报文段,不会出现丢包的现象。
    • TCP协议可以对接收到的乱序TCP报文段进行重排。
  3. TCP发送数据的单元是报文段而非整个报文
    TCP支持将大报文切分成小的报文段然后进行发送。也支持接收到各个报文段后,进行重装重组发送到应用层。
  4. 网络阻塞优化控制。

缺点:
慢,效率低,系统资源占用率高,每次建立连接前都要通过三次握手建立连接,连接过程非常复杂耗时;而且整个数据传输过程中,连接是不会断开的,也会占用系统的CPU、内存等硬件资源。而且在数据传递时,应答机制、超时重传机制、阻塞控制机制都会消耗大量的事件。

TCP数据传输过程:

三次握手:

TCP属于传输层协议,它是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次"对话"才能建立起来。其中的过程非常复杂,只简单描述下这三次对话的简单过程:主机A向主机B发出连接请求数据包:"我想给你发数据,可以吗?",这是第一次对话;主机B向主机A发送同意连接和要求同步的数据包:"可以,什么时候发?",这是第二次对话;主机A再发出一个数据包确认主机B的同步要求:"我现在就发,你接着吧!",这是第三次对话。三次"对话"的目的是使数据包的发送和接收同步,进过这三次"对话"之后,主机A才向主机B正式发送数据。 详细的过程如下:

  1. 主机A通过主机B发送一个含有同步序列号的标志位的数据段给主机B,向主机B请求建立连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信,你可以用哪个序列号作为起始数据段来回应我。
  2. 主机B收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用这个序列号作为起始数据段来响应我。
  3. 主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B的允许同步数据的响应:"我已收到回复,我现在要开始传输实际数据了",这样三次握手就完成了,主机A和主机B就可以传输数据了。

三次握手的特点:

三次握手的形象图:

为什么需要三次握手

既然总结了TCP的三次握手,那为什么非要三次呢?怎么觉得两次就可以完成了。那TCP为什么非要进行三次连接呢?在谢希仁的《计算机网络》中是这样说的:

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

在书中同时举了一个例子,如下:

"已失效的连接请求报文段”的产生在这样一种情况下:

client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。

假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。" 这就很明白了,防止了服务器端的一直等待而浪费资源。

四次挥手:

原文地址:TCP的三次握手(建立连接)和四次挥手(关闭连接)

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。

简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例:
1. 服务器读通道关闭
2. 客户机写通道关闭
3. 客户机读通道关闭
4. 服务器写通道关闭

关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段。直到接收到对方发送的FIN,且对方收到了接收确认ACK之后,双方的数据通信完全结束,过程中每次接收都需要返回确认数据段ACK。

详细过程:
第一阶段 客户机发送完数据之后,向服务器发送一个FIN数据段,序列号为i;
1. 服务器收到FIN(i)后,返回确认段ACK,序列号为i+1,关闭服务器读通道;
2. 客户机收到ACK(i+1)后,关闭客户机写通道;

(此时,客户机仍能通过读通道读取服务器的数据,服务器仍能通过写通道写数据)

第二阶段 服务器发送完数据之后,向客户机发送一个FIN数据段,序列号为j;
3. 客户机收到FIN(j)后,返回确认段ACK,序列号为j+1,关闭客户机读通道;
4. 服务器收到ACK(j+1)后,关闭服务器写通道。
这是标准的TCP关闭两个阶段,服务器和客户机都可以发起关闭,完全对称。

四次挥手的形象图:

为什么要四次分手?

四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工 模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2, 它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文 段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN 报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此 就会愉快的中断这次TCP连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。

参见 关于TCP协议,我想你应该懂了!

名词解释

  1. ACK TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号之前的数据段
    都收到了.比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性.
  2. SYN 同步序列号,TCP建立连接时将这个位置1
  3. FIN 发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1

UPD(User Data Protocol,用户数据报协议)

  1. UDP是一个无连接的协议,传输数据之前发送方和接收方不必先建立连接,当需要传送时就简单的接收应用层的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
  2. 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
  3. UDP信息包的首部开销很小,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
  4. 吞吐量不受阻塞控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
  5. UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。
  6. UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

我们经常使用"ping"命令来测试两台主机之间TCP/IP通信是否正常,其实"ping"命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。

优点:
1. 简单,系统资源占用率底,传输效率高:发送前不需要建立连接,无连接的服务,可以实现一对多,没有超时检测、应答机制,UDP就只负责接收数据、数据简单加工、传输数据。

缺点:
1. 无连接、不可靠:面向报文,尽最大努力交付,但是不保证

TCP和UDP的对比

  1. TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。

  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。

  3. TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。

  4. UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)。

  5. 每一条TCP连接只能是点到点的;UDP支持一对多的交互通信。

  6. TCP首部开销20字节;UDP的首部开销小,只有8个字节。

  7. TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。

为什么说TCP是面向连接的,UDP是无连接的

引用地址:TCP与UDP的区别

先说TCP协议:
这个协议,是面向的连接!面向连接这个概念,我们要从物理层看起。大家都知道,因为“信道复用技术”的迅猛发展,才促使了计算机网络的发展!如果没有“信道复用技术”,那么单条线路上(这里的线路指物理传输介质,例如:双绞线、光纤、电话线)单位时间内只能供一台计算机使用!还是举例说明:就拿你自己的计算机来说,你跟同学“小明”聊天的时候,就不能跟另外一位同学“小强”聊天,如果你想同时跟两位同学聊天,那么你就得装两条线路!那么同时与第三位、第四位同学。。。第N位同学聊天的时候,你需要装几根线路?全世界人民聊天的时候,又需要装几根线路?

“信道复用技术”实现了,在同一条线路上,单位时间内可供N台计算机同时通信!主要有以下几种复用技术:
1、频分复用 2、时分复用 3、波分复用 4、码分复用 5、空分复用 6、统计复用 7、极化波复用 >
关于“信道复用技术”更深层次的问题,需要你自己去研究!

上面我们提到了"信道复用技术"!知道了这一点,我们就很容易明白"物理信道"上的"虚拟信道"概念了!不同的信道复用技术,使用不同的复用技术,目的就是创建"虚拟信道"。

一个TCP协议连接其实就是在物理线路上创建的一条“虚拟信道”。这条“虚拟信道”建立后,在TCP协议发出FIN包之前(两个终端都会向对方发送一个FIN包),是不会释放的。正因为这一点,TCP协议被称为面向连接的协议!

UDP协议,一样会在物理线路上创建一条“虚拟信道”,否则UDP协议无法传输数据!但是,当UDP协议传完数据后,这条“虚拟信道”就被立即注销了!因此,称UDP是不面向连接的协议!

为什么说TCP是可靠的,UDP是不可靠的

因为TCP有应答机制,超时重发机制,乱序重排机制等,可以数据一定会被收到,且被正确消费掉。

UDP协议只负责收发数据,不负责任何异常情况的重试等。

TCP和UDP 各自应用场景

TCP应用场景

  1. 长连接,可靠传输:比如RPC调用和Http请求,不应该因为网络原因造成调用丢失或延迟。

UDP应用场景:

  1. 网络负担非常重,但对响应速度要求高。:即时通信。
  2. 拥有大量Client客户端:QQ,因为如果需要和每个客户端都建立一对一的长连接,对服务器压力非常大。
  3. 能够容忍部分数据报文的丢失:实时视频语音等。
  4. 网络数据中大多为短消息。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注