本文主要是介绍计算机网路第3章-运输层,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
概述和运输层服务
运输层协议为运行在不同主机上的应用进程提供了逻辑通信,从应用程序角度看,通过使用逻辑通信,就好像运行在不同主机上的进程直接相连在一起一样。
运输层和网络层的关系
网络层提供主机之间的通信,而运输层提供了不同主机上的不同进程的通信。
运输层只负责将自己的报文段提交给网络层或从网络层下载报文段,并不负责报文段在网络中的运输。
因特网运输层概述
因特网为用户提供了两种基本的运输层协议:
TCP(传输控制协议)和UDP(用户数据报协议)
其中,UDP和TCP最基本的责任是,将两个端系统间IP的交付服务扩展为运行在端系统上两个进程之间的交付服务。
将主机间交付扩展到进程间交付被称为运输层的多路复用与多路分解。
UDP和TCP也可以在报文段首部中包括差错检查字段,以提供完整性检查。
其中,进程到进程的数据交付和差错检查是两种最低限度的运输层服务,也是UDP只能提供的两种服务。
多路复用与多路分解
在接收端,运输层检查这些字段,标识出应用进程端口号,进而将报文段定向到该套接字。
将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。
从源主机中不同套接字收集数据块,并为每块封装首部信息生成报文包,然后将报文报提交给网络层,这些工作被称为多路复用。
运输层报文段的基本组成
1.套接字有唯一的标识符。(即主机IP和端口号)
2.报文报有源端口号字段,目的端口号字段。(UDP报文段只有这两个,TCP还包括源IP字段和目的IP字段。)
其中端口号是一个16比特的数值,范围在0~65535之间。
其中0~1023是周知端口号,这是保留给某些众所周知的应用所使用的。
诸如HTTP端口号是80。
无连接的多路复用与多路分解
即UDP所提供的多路复用和多路分解。
一个UDP套接字是由一个二元组全面标识的,该二元组包含一个目的IP和一个目的端口号。
因此,如果两个UDP报文段拥有不同的源IP地址,但是具有相同的目的IP和目的端口号,这两个报文段就会被同一个UDP套接字所接收。
源端口号的用途是什么呢?
很简单,源端口号/源IP用来返回一个响应报文,响应报文中的目的IP和目的端口号就是请求报文的源IP和源端口号。
面向连接的多路复用和多路分解
即TCP所提供的多路复用和多路分解。
TCP与UDP一个细微区别就是,TCP是由一个四元组唯一标识的(目的IP、目的端口号、源IP、源端口号)这四个部分,只要有一个不同,那么就被TCP认为是两个不同的报文段,需要被两个独立的TCP套接字所接收。
下面,我们来阐述一个TCP报文段从网路到达目的主机的一个过程。
1.TCP服务器应用程序有一个“欢迎套接字”,该套接字在12000端口号上等待用户发来的连接建立请求。
2.现在有两条报文段被发送过来,两条报文段中,只有源IP不一样,其余的源端口号、目的IP、目的端口号皆相同。
3.欢迎套接字接收这两个报文段,同时进行分析判断两个报文段是否一致,因为两个报文段的源IP不一样,所以被认为是两个不同的报文段!
4.欢迎套接字创建两个新的TCP套接字,分别接收两个TCP连接请求报文段。
无连接运输:UDP
UDP只是做了运输协议所能做的最少工作:(多路复用/分解、差错检测)
实际上,如果应用程序使用的是UDP协议,那么UDP将会直接跟IP打交道。
值得注意的是,UDP发送报文段之前,发送方和接收方并没有握手,所以UDP也被称为是无连接的。
DNS就是一个常见的使用UDP协议的例子。
UDP的优点
1.关于发送什么数据以及何时发送的应用层控制更为精细
采用UDP的时候,只要应用程序将数据塞进UDP,UDP就会把数据打包进UDP报文段并且立即传送给网络层。
同时UDP相较于TCP没有拥塞控制机制,因此UDP可以比TCP有更加强大的性能体验,因为它并不需要额外的性能支出,用来提供额外的服务(拥塞控制机制、安全性保护等)
2.无需连接建立
TCP在开始连接之前,需要经过三次握手。
而UDP无需握手,即不需要构建连接,因此省去了建立连接的时间。
为此UDP协议没有建立连接的时延,这对于一些时延要求很低的应用程序,是必不可少的。
3.无连接状态
TCP需要在端系统中维护连接状态,包括接收和发送缓存、拥塞控制参数以及序号与确认号的参数。
而UDP不需要提供这些参数,因此UDP相较于TCP一般可以保持更多的活跃用户。
4.分组首部开销小
UDP报文段首部仅有:
目的IP和目的端口号。
而TCP报文段首部包含:
目的IP和目的端口号、源IP和源端口号。
综上,我们可以明白DNS为什么要使用UDP协议了,因为UDP协议没有建立连接的时延,这对于DNS来说非常重要,如果DNS采用TCP协议,那么DNS发送一个主机名查询报文段,将会获得较大的时延,这对于用户的体验是非常糟糕的。
虽然UDP协议不保证数据传输是可靠的,但这对于DNS是可容忍的,当使用UDP协议时,查询报文返回一个出错的数据后,DNS可以选择拒绝将出错数据传送给应用程序,或者将出错数据传送给应用程序并且给出报错信息。
不过值得注意的是,UDP虽然并不提供安全性保证,但可以在应用程序开发的时候,由开发人员在应用程序中内置安全性保护措施,从而使UDP也具有保护措施。
UDP报文段结构
UDP首部只有四个字段,每个字段占用两个字节。
长度字段指明了UDP报文段中的字节总数(首部加数据)。
检验和字段用来验证UDP报文段是否出错。
UDP检验和
UDP检验和提供了差错检测功能,但是这种功能仅仅能判断报文段是否出错,并不能判断出是哪一位字节或者哪些位字节出错,且不具备纠错的能力。
为此在UDP套接字检测到UDP报文段出错后,只能选择丢弃该报文段,或者将该报文段仍提交给应用数据,但附加一个出错信息用来应用程序提供报错信息。
UDP检验和的演算
UDP接收方对报文段中的所有16比特字的和进行反码运算,同时任何溢出都会被直接丢弃。
例如,下面我们由3个16比特的字:
0110 0110 0110 0000
0101 0101 0101 0101
1000 1111 0000 1100
其中按两个的和是:
1011 1011 1011 0101
再将这个和与上面的第三个比特相加,得:
0100 1010 1100 0010
再将这个和取反:
1011 0101 0011 1101
这就变成了检验和。
在接收方UDP套接字中,如果全部的四个比特字(原先的三个比特字和检验和)加在一起,如果该分组中没有出现错误,那么该和会是:
1111 1111 1111 1111
即全是1,但若16位中的某一位或多位出现了0,那么该分组中就出现了差错。
为什么UDP要具有差错检测
首先,如果端到端数据传输要提供差错检测(即不同主机上的不同应用进程传输),那么UDP就必须在端到端基础上在运输层提供差错检测。
这是一个在系统设计中被称为颂的端到端原则。
这篇关于计算机网路第3章-运输层的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!