@boothsun
2018-01-02T17:33:02.000000Z
字数 7804
阅读 1169
网络编程
- 参考原文:HTTP协议—— 简单认识TCP/IP协议
- 参考原文:计算机网络中的七层模型
- 参考原文:计算机网络协议层次
- 参看原文:TCP和UDP的区别(转)
如果要了解一个人,可以从他归属的集体聊起来。我们的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 用户数据包协议)协议。
网络层:
其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。
一般地,数据链路层是解决同一网络内节点之间的通信,而网络层主要解决不同子网间的通信。例如在广域网之间通信时,必然会遇到路由(即两节点间可能有多条路径)选择问题。
数据链路层:
数据链路层是为了解决路由器到你的电脑之间的地址选择,连接建立,差错控制等问题。
它控制网络层与物理层之间的通信。它的主要功能是如何在不可靠的物理线路上进行数据的可靠传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来移动数据的结构包,它不仅包括原始数据,还包括发送方和接收方的物理地址以及检错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。 如果在传送数据时,接收点检测到所传数据中有差错,就要通知发送方重发这一帧。
网络层通过源和目的地之间的一系列路由器路由数据报,为了将分组从一个结点移动到路径的下一个结点,网络层必须依靠链路层的服务。特别是在每个结点,网络层将数据报下传给链路层,链路层沿着路径将数据报传递给下一个结点,在下一个结点,链路层将数据报上传给网络层。
由链路层提供的服务取决于应用于该链路的特定的链路层协议,比如我们常见的以太网,WIFI等。
因为数据报从源到目的地传送通常要经过几条链路,一个数据报可能被沿途不同链路上的不同链路层协议处理。例如,一个数据报可能被一段链路上的以太网和下一段链路上的PPP所处理。网络层将受到来自每个不同链路的链路层协议的服务。
总而言之,数据链路层解决了不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。
物理层:
建立、维护、断开物理连接。(由底层网络定义协议)
主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
该层包括物理连网媒介,如电缆连线连接器。物理层的协议产生并检测电压以便发送和接收携带数据的信号。在你的桌面P C 上插入网络接口卡,你就建立了计算机连网的基础。换言之,你提供了一个物理层。尽管物理层不提供纠错服务,但它能够设定数据传输速率并监测数据出错率。网络物理问题,如电线断开,将影响物理层。 用户要传递信息就要利用一些物理媒体,如双绞线、同轴电缆等,但具体的物理媒体并不在OSI的7层之内,有人把物理媒体当做第0层,物理层的任务就是为它的上一层提供一个物理连接,以及它们的机械、电气、功能和过程特性。如规定使用电缆和接头的类型、传送信号的电压等。在这一层,数据还没有被组织,仅作为原始的位流或电气电压处理,单位是bit比特。
缺点:
慢,效率低,系统资源占用率高,每次建立连接前都要通过三次握手建立连接,连接过程非常复杂耗时;而且整个数据传输过程中,连接是不会断开的,也会占用系统的CPU、内存等硬件资源。而且在数据传递时,应答机制、超时重传机制、阻塞控制机制都会消耗大量的事件。
TCP数据传输过程:
TCP属于传输层协议,它是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次"对话"才能建立起来。其中的过程非常复杂,只简单描述下这三次对话的简单过程:主机A向主机B发出连接请求数据包:"我想给你发数据,可以吗?",这是第一次对话;主机B向主机A发送同意连接和要求同步的数据包:"可以,什么时候发?",这是第二次对话;主机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连接。如果要正确的理解四次分手的原理,就需要了解四次分手过程中的状态变化。
我们经常使用"ping"命令来测试两台主机之间TCP/IP通信是否正常,其实"ping"命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
优点:
1. 简单,系统资源占用率底,传输效率高:发送前不需要建立连接,无连接的服务,可以实现一对多,没有超时检测、应答机制,UDP就只负责接收数据、数据简单加工、传输数据。
缺点:
1. 无连接、不可靠:面向报文,尽最大努力交付,但是不保证
TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)。
每一条TCP连接只能是点到点的;UDP支持一对多的交互通信。
TCP首部开销20字节;UDP的首部开销小,只有8个字节。
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协议只负责收发数据,不负责任何异常情况的重试等。