TCP/IP体系结构
1.来源
脱生于OSI七层协议体系结构
OSI七层结构虽然各结构概念清晰,理论也很完整,但是过于复杂并且不实用。
2.结构
TCP/IP是一个四层的体系结构,有着非常广泛的应用。
TCP/IP自上而下依次是应用层,运输层,网际层,网络接口层。(用网际层这个名字是强调这一层是为了解决不同网络的互连问题)
从实质上讲,TCP/IP只有上面三层,因为最下面的网络接口层并没有什么具体内容。因此在学习计算机网络的原理时往往采用折中的办法,即总和OSI和TCP/IP的优点,采用一种五层协议的体系结构。
(五层协议的体系结构只是为介绍网络原理而设计的,实际应用还是TCP/IP四层体系结构。 )
注🎍:1. 下面提到的“分组”和“数据报”为同义词;“网络层”,”网际层“,“IP层”为同一意思。
2. 无论在哪一层的数据单元都可以笼统地用“分组”来表示
TCP/IP体系结构
各层 | 功能/任务 | 协议 | 数据单元 |
---|---|---|---|
5 应用层 |
Application Layer 1.定义应用进程间通信和交互的规则 通过应用进程间的交互来完成特定网络应用。 进程即指主机中正在运行中的程序。 不同网络应用需要有不同的应用层协议,如右边👉所示。 |
域名系统DNS, 支持万维网应用的HTTP, 支持电子邮件的SMTP, TELNET,FTP等 |
应用层交互的数据单元称为: 报文(message) |
4 运输层 |
Transport Layer 1.负责向两台主机中进程之间的通信提供通用的数据传输服务(或者说是为相互通信的应用进程提供逻辑通信)。 “通用”即指:并不是针对某个特定网络应用,而是多种应用可以使用同一个运输层服务。 2.由于同一台主机可以同时运行多个进程,因此运输层有复用和分用的功能。 复用,即多个应用层进程可同时使用下面运输层的服务。 分用,与复用相反,是运输层把收到的信息分别交付给上面应用层中的相应进程。 |
TCP(传输控制协议): 提供面向连接,可靠的数据传输服务 UDP(用户数据报协议): 提供无连接的、尽最大努力的数据传输服务 (不保证数据传输的可靠性) |
TCP传输单位:报文段(segment) UDP传输单位:用户数据报 |
3 网际层 (或称网络层,IP层) |
Network Layer 1.负责为分组交换网上的不同主机提供通信服务。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。 2.选择合适的路由,使源主机运输层所传下来的分组,能通过网络中的路由器找到目的主机。 |
IP协议 | 分组,包 由于网际层使用IP协议,故这里的分组也叫做IP数据报,简称数据报。 |
2 数据链路层 |
Data Link Layer 简称:链路层 1.两台主机之间的数据传输总是在一段一段的链路上传送的,因此需要使用专门的链路层协议。 2.在两个相邻结点之间传送数据时,链路层将网络层交下来的IP数据包组装成帧,在两个相邻节点之间的链路上传送帧。 每一帧包括:数据和必要的控制信息(如,同步信息,地址信息,差错控制等等。), 3.关于控制信息。在接收数据时,控制信息使得接收端能够知道一个帧从哪个比特开始,到哪个比特结束,这样数据链路层在接受到一个帧后,就能从中提取出数据部分上交给网络层。 控制信息还使接收端能检测出收到的帧中有无差错,若有差错链路层就简单地丢弃这个出了差错的帧,以免继续在网络中传送下去浪费网络资源。 如果需要改正数据在链路层传输时出现的差错,(即链路层不仅要检错,还要纠错)则要采用可靠传输协议来纠正出现的差错,当然这样会使链路层协议复杂些。 |
帧(frame) | |
1 物理层 |
1.发送方发送1(或0)时,接收方收到1(或0),而不是0(或1);因此物理层需要考虑用多大的电压代表“1”或“0”,以及接收方如何识别出发送方所发送的比特。 2. 物理层还要确定连接电缆的插头应当有多少根引脚以及各个引脚应当如何连接。 3. 解释比特代表的意思,则不是物理层的任务了。 4. 传递信息所利用的一些物理媒体,如双绞线、同轴电缆、光缆、无线信道等,并不在物理层协议之内,而在物理层协议的下面。因此也有人将物理层下面的物理媒体当作第0层。 |
比特 |
下图即演示了数据在两主机的各层之间的传递过程:
3. 运输层介绍
3.1 从进程间通信的角度来看运输层的功能
运输层的作用:
从通信和信息处理来看,运输层向它上面的应用层提供通信服务,它是面向通信部分的最高层,同时也是用户功能的最低层。它为相互通信的应用进程提供逻辑通信。
谁拥有运输层:
当网络的边缘部分的两台主机使用网络的核心部分的功能进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分的路由器在转发分组时都只用到下三层的功能(可以看上面那幅图)。
为什么需要运输层:
🧠:为什么需要运输层?IP协议既然可以吧源主机A发送出的分组,按照首部中的目的地址,送交到目的主机B,那么为什么还要运输层呢?
1.先说明结论:因为IP协议虽然能把分组送到主机,但是这个分组还停留在该主机的网络层,而没有交付主机中的应用进程。
2.IP数据报的首部确实明确地标志了两台主机的IP地址,我们也常说“两台主机之间的通信”,但事实上真正通信的实体是在主机中的进程,使这台主机中的一个进程和另一台主机中的一个进程在交换数据(即通信)。
因此严格来说,两台主机通信实际上就是两台主机中的应用进程相互通信。
3。而从运输层的角度来看,通信的真正端点并不是主机,而是主机中的进程,也就是说,端到端的通信是应用进程之间的通信。这才是我们所真正需要的。
运输层的几个功能
1.复用与分用
在实际场景中,在一台主机中常常有多个应用进程同时分别与另一台主机中的多个应用进程通信,这都依赖于运输层的复用与分用功能。
复用(multiplexing):就是指发送方不同的应用进程都可以使用同一个运输层协议传送数据(当然要加上适当的首部);
分用:则是指接收方的运输层在剥去报文的首部后能够把这些数据正确交付目的应用进程。
🎍:IP层也有复用和分用的功能。
复用即发送方不同协议的数据都可以封装成IP数据报发送出去,
分用即是在接受方的IP层可以根据IP首部中的协议字段进行分用,把剥去首部后的数据交付给应当接受这些数据的协议。
2.运输层为应用进程提供逻辑通信
逻辑通信的意思是:从应用层来看,只要把应用层报文交给下面的运输层,运输层就可以把这个报文传送到对方的运输层(哪怕双方相距很远,例如几千公里),好像这种通信就是沿着水平方向直接传送数据。但事实上这两个运输层之间并没有一条水平方向的物理连接。
逻辑通信就是说,“好像是这样通行的,但事实上并非真的这样通行。 ”
3. 网络层与运输层的几点区别
- 网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。
- 在网络层中,IP数据报首部中的检验和字段 只检验首部是否出现差错,而不检查数据部分;
而运输层还要对收到的报文进行差错检测。 - 另外,运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑,所采用的路由选择协议等等),它使应用进程看见的好像就是两个运输层实体之间有一条端到端的逻辑通信信道。
但事实上,在运输层使用不同的协议时,这条逻辑信道对上层的表现有很大的差别。
当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的(只提供尽最大努力的服务),但是这种逻辑通信信道就相当于一条全双工的可靠信道。
但当运输层采用无连接的UDP协议时这种逻辑通信信道任然是一条不可靠信道。
4. TCP和UDP区别的的简要阐述
- UDP 在传送数据之前,不需要先建立连接;目的主机的运输层在收到UDP报文后不需要给出任何确认。
虽然UDP不提供可靠交互,但在某些情况下,却是一种最有效的工作方式。 - TCP的提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后,要释放连接。
TCP不提供广播或多播服务,由于TCP要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多的开销,如确认、流量控制、计时器及连接管理等,这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。
使用UDP和TCP的各种应用和应用层协议
应用 | 应用层协议 | 运输层协议 |
---|---|---|
名字转换 | DNS(域名系统) | UDP |
文件传送 | TFTP(简单文件传送协议) | UDP |
路由选择协议 | RIP(路由信息协议) | UDP |
IP地址配置 | DHCP(动态主机配置协议) | UDP |
网络管理 | SNMP(简单网络管理协议) | UDP |
远程文件服务器 | NFS(网络文件系统) | UDP |
IP电话 | 专用协议 | UDP |
流式多媒体通信 | 专用协议 | UDP |
多播 | IGMP(网际组管理协议 | UDP |
电子邮件 | SMTP(简单邮件传送协议) | TCP |
远程终端接入 | TELNET (远程终端协议) | TCP |
万维网 | HTTP(超文本传送协议) | TCP |
文件传送 | FTP(文件传送协议) | TCP |
5.运输层的端口号
1.对端口的解释
为了实现复用和分用的功能,我们希望为各个应用进程赋予一个明确的标志。
在计算机中的进程是用进程标识符来标志的, 但是在互联网环境下有不同的操作系统,不同的操作系统又使用不同的进程标识符。为了使不同的操作系统能够相互通信,就必须使用统一的方法来对TCP/IP体系的应用进程进行标识,并且这种方法要与操作系统无关。
由于进程的创建和撤销都是动态的,因此我们不能将互联网上通信的终点指明为某一个进程。
由于我们通常是利用目的主机提供的功能来识别终点,而不需要知道具体实现这个功能的进程是哪一个(例如要和互联网上的某个邮件服务器联系,并不一定需要知道这个服务器功能是由目的主机的那个进程实现的。),故虽然通信的终点是应用进程,但我们只需要将所传诵的报文交到目的主机的某个合适的目的端口,剩下的工作(即最后交付目的进程)由UDP和TCP来完成即可。
基于此的方法就是在传输层使用协议端口号(protocol port number)**,简称端口**。
🍎这种协议栈层间的抽象的协议端口是软件端口,和路由器或事交换机上的硬件端口是完全不同的概念。硬件端口是不同硬件设备进行交互的借口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的恶意中地址。不同的系统具体实现端口的方法可以是不同的。
2.端口的种类
1.从通信的双方来看:有源端口和目的端口。
UDP和TCP的首部格式中都有源端口和目的端口这两个重要字段。
TCP/IP的运输层用一个16位的端口号来标志一个端口,26位的端口号可允许有65535个不同的端口号,这对一个计算机来说是足够用的。
当运输层收到IP层交上来的运输层报文时,运输层就能根据其首部中的目的端口号交付应用层的目的应用进程。
🍎端口号只具有本地意义,即只在本主机中起作用,它只是为了标志本计算机应用层的各个进程和运输层交互时的层间接口。在互联网的不同计算机中,相同的端口号是没有关联的。
🧠:从上面所说,我们可以知道,两个计算机中的进程要进行通行,不仅必须知道对方的IP地址(这是为了找到对方的计算机),还要知道对方的端口号(这是为了找到对方计算机中的应用进程)。
2.**互联网上的计算机通信是采用客户-服务器(Client- Server,C/S)方式的。客户在发起请求时,必须知道对方服务器的IP地址和端口号。因此运输层的端口号氛围下面两大类:服务器端使用的端口号与客户端使用的端口号**。
服务器端使用的端口号有两类:
熟知端口号(或称系统端口号),数值为0~1023。(www.iana.org 可查),这些端口号被派给TCP/IP最重要的一些应用程序,让所有用户都知道。当一种新的应用程序出现后,IANA必须给它指派一个熟知端口,否则互联网上的其他应用进程没有办法和它通信。
常用的熟知端口号
应用程序 FTP TELNET SMTP DNS TFTP HTTP SNMP SNMP(trap) HTTPS 熟知端口号 21 23 25 53 69 80 161 162 443
- 登记端口号,又叫短暂端口号,数值为49152~65535,仅在用户进程运行时才动态选择,即是留给客户进程选择暂时使用。
当服务器进程收到客户进程的报文时,就知道了客户进程所使用的端口号,因而可以把数据发送给客户进程。当通信结束后,刚才已使用过的客户端口号就不复存在,这个端口号就可以供其他客户进程使用。
3.2 用户数据报协议UDP(User Datagram Protocol)
3.3 传输控制协议TCP(Transmission Control Protocol)
1. TCP协议的一些特点
- TCP是面向连接的运输层协议。即应用程序在使用TCP之前必须先建立TCP链接,在传送数据完毕后必须释放已经建立的TCP连接。
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(即一对一的)。
- TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。
- TCP提供全双工通信。
TCP允许通信双方的应用进程在任何时候都能够发送数据,TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的的数据。
在发送时,应用进程在把数据传送给TCP的缓存后,就可以去干自己的事情了,而TCP在合适的时候把数据发送出去。
在接收时,TCP吧收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。 - 面向字节流。
“流”即流入到进程或是从进程流出的字节序列。
面向字节流的含义是:虽然应用程序和TCP的交互式一次一个数据块(大小不等),但是TCP吧应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
TCP并不知道所传送的字节流的含义。
TCP也不保证对方应用程序收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如发送方应用程序交给发送方的TCP共10个数据块,但是接受方的方TCP可能只用了4个数据块就把收到的字节流给交付上层的应用程序了。)
但是接受方应用程序收到的字节流必须和发送方发出的字节流完全一样。当然,接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。 - TCP报文段的传送过程:TCP报文段先要传送到IP层,加上IP首部后,在传送到数据链路层,在加上数据链路层的首部和尾部后,才离开主机发送到物理链路。
- TCP与UDP发送报文时采用完全不同的方式。
TCP并不关心应用进程一次把多少报文发送到TCP的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字(而UDP发送的报文长度则是应用进程给出的),如果应用进程传送到TCP缓存的数据块太长,TCP就可以把它划分短一些再传送;如果应用进程一次只发过来一个字节,那TCP可以等待积累足够多的字节后再构成报文段发送出去。
2. 关于TCP的连接
TCP把连接作为最基本的抽象,TCP许多特性都和TCP是面向连接的这个基本特性有关。故有必要了解一下TCP的连接。
🧠:每一条TCP连接都有两个端点,这个端点是指啥呢?👇
⚠️:端点不是指主机,也不是主机的IP地址,不是应用进程,也不是运输层的协议端口。
TCP连接的端口叫做套接字(socket)**或叫插口,端口号跟IP地址拼接到一起即构成了套接字**。
形式为:
套接字socket = (IP:端口号);(IP地址采用点分十进制写法)
如:IP地址为192.3.4.5 ,而端口号是80,那么得到的套接字记为(192.3.4.5:80 )。
每一条TCP连接唯一地被痛惜娘段的两个端点(即两个套接字)所确定,即:
TCP连接 ::= {socket1, socket2} = { (IP1,port1) , (IP2,port2) } ;
总之,TCP连接就是由协议软件所提供的一种抽象。虽然有时候为了方便我们也可以说,在一个应用进程和另一个应用进程之间建立了一条TCP连接,但要记住,TCP连接的端点是个很抽象的套接字。
🍎:同一个IP地址可以有多个不同的TCP连接,因为IP地址只是说明了主机位置,而TCP连接对应具体进程;
而同一个端口号也可以出现在多个不同的TCP连接中,与上面同理,即因为端口号并未标明具体进程。
3. TCP可靠传输的工作原理
🧠:为什么TCP需要采取一些措施来做到可靠传输呢?
因为TCP发送的报文段是交给IP层传送的,但是IP层只提供尽最大努力服务,即是不可靠的传输,故传输层必须采取适当的措施才能让两个传输层之间的通信变的可靠。
理想中的传输条件:
- 传输信道不出差错;
- 不管以多快的速度发送数据,接收方总是来得及处理接受到的数据。
现实中:
- 一个也做不到。。。
解决方法:
使用一些可靠的传输协议,使得
- 当出现差错时,能让发送方重传出现差错的数据;
- 同时,当接受方来不及处理收到的数据时,及时告诉发送方见底发送数据的速度。
这样一来,本来不可靠的的传输信道就能够实现可靠传输了。
3.1 停止等待协议
全双工通信的双方既是发送方也是接收方,为讨论方便,下面让A发送,B接收,即A为发送方,B为接收方。
所谓“停止等待”就是每发送完一个分组就停止发送,等待对方确认,在收到确认后再发送下一组。
1.无差错情况
如图(a),即传输过程没有任何差错。
A发送完分组M1就暂停发送,等待B确认收到M1;
自然,B收到了M1就向A发送确认。
A收到了B对M1的确认后,再发送下一个分组M2,等待B确认收到M2;
B收到了M2就向A发送确认;
A收到了B对M2的确认后,在发送下一个分组M3;
。。。。。。。。。。。。
2.出现差错
即如图(b)所示,
收接收M1时检测出了差错,就丢弃M1,其他什么也不做(即不通知A收到有差错的分组);
也可能M1在传输过程中就丢失了,B自然什么都不知道,也不会向A发送任何信息。
我们的可靠传输协议这样设计:
A只要超过一段时间仍然没有收到确认,就认为刚才发的分组丢了,因而重发前面发送过的分组,我们称之为 超时重传。
要实现超时重传,就要在每发送出去一个分组后设置一个超时计时器,如果超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器
🤔:注意几点
- A发送完一个分组后必须暂时保留已发送的分组的副本,在超时重传的时候能用到。只有收到确认后才能清除暂时保留的副本。
- 分组和确认分组都要进行编号。这样才能明确哪一个发送出去的分组收到了确认,而哪一个没有收到确认。
- 超时计时器设置的重传时间应当比数据分组传输的平均时长更长一些,因为传送的数据可能会稍晚到达。
因为既不能设置太长导致效率低下,也不能设置太短导致不必要的重传。
重传时间的设置是非常复杂的,因为路上经过哪些网络产生多大的时延(这取决于这些网络当时的拥塞状况),这些都是不确定因素。
3.确认丢失和确认迟到
现在我们讨论,B收到了A发送的分组,但是B发送的确认却出了问题。
确认丢失
如图(a)
B在收到M1后向A发送了确认,但是A在超时重传时间内却没有收到,
A不知道是自己的发送出错或丢失了,还是说B发送的确认丢失了。
因此,A在超时计时器到期后就重传M1。
如此,B再次收到了A发来的M1。下面开始说我们需要的操作,B要采取以下全部两个行动:
- 丢弃这个重复的分组M1,不向上层交付;
- 向A发送确认。因为既然A又发了一遍M1,就说明他没有收到确认,因此B需要再发一次确认。
确认迟到
如图(b)
B在收到了M1后,向A发送了确认,传输过程中也没有出错,但是这个确认到达A时却迟到了。
那么由于A没有收到确认,故会再发一次M1,
故B会再收到一次M1,由于B已经收了一次M1,故会把这个重复的M1丢掉,并再发一次确认;
那么可想而知A总共会收到一次迟到确认和B第二次发来的确认,即共收到两次确认,既然收到了确认,即证明B收到了好的M1,所以A只会接收一次确认,再收到关于M1的确认时,也是做丢弃处理。
总结:B收到两次M1,A收到两次确认,他们的操作都是把第二次收到的东西丢弃,区别是B收到第二次M1后会再发一次确认。
通常A最终都会收到对所有发出分组的确认,不如过A不断重传但总收不到确认,就说明通信线路太差,不能进行通信。
通过上述这些机制,我们便可以在不可靠的传输网络上实现可靠的通信。
总结:向上述这样的可靠传输协议常称为**自动重传请求ARQ(Automatic Repeat reQuest)**,意思是重传的请求是自动进行的,而不需要接收方专门请求发送方重新发送某个分组。
4.信道利用率
TD:A发送一个分组的时间
TA:B发送一个确认
RTT:往返时间;
则称
U = TD/(TD+TA+RTT)
为信道利用率,U当然越大越好啦。
而RTT会占用大量时间,故为了提高信道利用率,我们可以不采用低效率的停止等待协议,而让发送方采用流水线传输,即发送发连续发送多个分组,不必每发送完一个就停下来等待对方确认,这样可以使信道上一直有数据不间断地在传送,这样我们能获得很高的信道利用率。
当采用流水线传输的时候,我们便要用到连续ARQ协议和滑动窗口协议了。