您的位置:首页 > 理论基础 > 计算机网络

【computer network】运输层:TCP可靠数据传输原理、UDP

2017-08-22 15:50 465 查看

更新中……

转载请说明出处:http://blog.csdn.net/guwuchangtian/article/details/77481224

概述

运输层:为运行在不同主机上的进程之间提供逻辑通信功能。

与网络层的关系:运输层是为进程提供通信,网络层是为主机提供逻辑通信。所以运输层运行于主机上为应用程序进程提供服务,而网络层则运行于整个网络,为所有主机(也可以说是传输层)提供服务。

IP协议:即网际协议(internet protocol),是网络层协议,IP服务模型是提供尽力而为的交付服务,即不提供任何保证服务的委婉说法,因为它不做任何的确保,只“尽最大努力”为传输层提供报文段,因此IP被称为不可靠服务。

当网络层数据报交付给运输层时,运输层如何区别是那个进程的报文?

套接字绑定,多路复用和多路分解。

套接字绑定:应用层的每个进程,都会与一个或多个套接字绑定,用套接字标识来将进程和套接字绑定。(如高性能web服务器通常只使用一个进程,而为每个新的连接创建新线程创建一个新的绑定新端口的套接字)

多路复用:从主机收集应用层的进程产生的报文,添加适当的首部(包含用于多路分解的内容)生成报文段,将报文段传递给网络层的过程,称为多路复用。

多路分解:将运输层报文段报文首部解析,匹配套接字标识,将相应的报文交付到正确的套接字称为多路分解。

如何实现多路复用和多路分解:

标识:

① 套接字有唯一标识

② 每个报文段有特殊字段来指示该报文段所要交付到的套接字。

特殊字段包括源端口号字段、目的端口号字段、以及一些TCP和UDP特有的字段。

端口号:(source port number field),是一个16比特的数,大小为0~65535,其中0~1023称为周知端口号,是受限的,它为一些著名的程序或协议保留,如HTTP默认端口为80,FTP为21。

如何多路分解:主机上的每个套接字与一个端口号绑定,当报文段到达主机时,应用层检查报文段中的目的端口号,将它定向到对应的套接字,报文中的数据通过套接字进入对应进程中
4000
。(UDP是这样的,TCP比这个复杂得多)

UDP套接字标识:由一个二元组标识,即(目的IP地址,目的端口号)。运输层报文段通过解析首部来找到对应二元式的UDP套接字。

TCP套接字标识:由一个四元组标识,即(源IP地址,源端口号,目的IP地址,目的端口号),运输层通过解析首部来找到对应四元式的TCP套接字,与UDP不同的是,当一个源IP地址或源端口号不同时,将被定向到不同的套接字。

端口扫描:攻击者通过扫描攻击对象主机的端口,来找到存在漏洞的端口程序。

UDP

UDP做的工作:除了运输层必须支持的多路复用和多路分解之外,只提供了简单的基于16bit校验和的差错检测功能,使用UDP差不多相当于和IP打交道。

UDP工作流程:当应用进程使用UDP进行通信是,UDP接收进程报文,附加上目的IP和目的端口号,以及其他两个小字段,形成报文段交给网络层,网络层将报文段封装成一个IP数据包,并尽力而为地将它交付到目的主机。

没有握手: UDP在传输数据之前没有握手,因此被称为无连接的。DNS 是一个使用UDP运输层协议的典型例子。

UDP的优势:既然UDP“几乎不”提供服务,那么为什么还要选择UDP来进行传输呢?

① 发送时间控制精确:UDP只要报文准备好就立即发送,而TCP为保证可靠性,有时需要重复发送相同报文,直到接收方确认。

② 无需建立连接:TCP传输前需要三次握手。

③ 无连接状态:TCP需要在端系统中维护连接状态。

④ 首部开销小。

UDP缺点:无连接,不可靠,无状态,不能进行拥塞控制(对整个网络来说,这是一个很致命的缺点)。

UDP报文段结构:首部包括四个字段,(源端口号,目的端口号,长度,校验和)每个字段2字节。结构如下图:



UDP校验和:发送方将报文段中的所有16比特字的进行反码运算,求和时遇到的所有溢出都被回卷,得到的结果放到校验和部分。接收方将接收到的报文段进行16比特相加,再加上校验和,如果结果为全1,则正确,有一个0则出现差错。

UDP无恢复能力:虽然UDP可以进行差错检测,但没有恢复能力,有的实现是将报文段直接丢弃,有的实现是将报文段交给应用程序,由应用程序来处理,如发出警告之类的。

TCP

可靠数据传输原理

可靠数据传输协议也是不断完善了,从一开始的rdt1.0到rdt3.0,每个版本都比上一版本提供更可靠的数据传输,最后得到一个无错的、可靠地协议。

\\\\\\\\\\\\\\\\\\ 经完全可靠信道传输的传输层协议 rdt1.0

该协议将可靠传输任务完全交由下层的可靠信道来处理,而如何构建这样的可靠信道并不是现在讨论的重点,我们先假设有这么一条可靠信道,分组以发送的顺序进行交付,分组和比特都不丢失。

一旦传输信道可靠,那么运输层需要做的就只有发送和接收工作了。

FSM:(finite-state machine)有限状态机

rdt_send(data):上层(应用层)数据传输接口,传输的数据为data。rdt的意思是可靠数据传输,send的意思是发送。

udt_send(packet):下层(网络层及下层)提供的数据传输接口,不可靠数据传输。

deliver_data(data):向叫高层交付数据。

rdt 1.0的FSM如下图:



\\\\\\\\\\\\\\\\\\ 经有比特差错信道的传输协议 rdt2.0

该版本协议由“肯定确认”和“否定确认”机制来进行支持,当接受方接收到正确数据,需要回复“肯定确认”,当检测到有差错时,需要回复“否定确认”,并提供自动重传机制。

rdt2.0需要以下三种功能的支持:

差错检测:通过冗余比特来检测并力求纠正差错,将在后续(物理层)讲到。

接收方反馈:接收方需要反馈接收到的数据是否正确,正确则回复“ACK”(用1表示),错误则回复“NAK”(用0表示)。

重传:接收方收到有差错的分组是,发送方将重传。

rdt 2.0的FSM如下图:

发送方:



接收方:



rdt2.0有一个致命的缺点,就是如果ACK/NAK分组出错,则发送方将不知道接收方是否正确接收到了数据,一种解决办法是在ACK/NAK含糊不清时,直接重传分组。这样又引进一个问题,接收方如果正确接收到了分组,但是反馈的ACK出错,发送方又重传了分组,那么接收方将不知道接收到的是一个新的分组还是重传的分组。

rdt2.1中,在ACK/NAK含糊不清时重传,并使用1bit为来区分接收到的是新的分组和还是重传的分组。

rdt2.2中,与rdt 2.1的区别是,没有NAK反馈,如果发送方接收到了两个同一分组的ACK之后,就说明接收方为接收到正确的数据,则会重传。

\\\\\\\\\\\\\\\\\\ 经有比特差错和丢包信道的传输协议 rdt3.0

rdt 3.0解决的主要问题是:如果发送过程中发生了丢包,接收方将收不到包,也就不可能发送ACK/NAK进行确认,这种情况下,发送方是否需要重传?

rdt 3.0引入了计时器,在发送方发送一个包时,启动一个倒计时,如果在倒计时结束还未收到ACK,则重传该分组。若收到ACK/NAK则中断计时器。rdt 3.0是可靠数据传输协议。

rdt 3.0的FSM如下图:

发送方:



接收方:



可靠数据传输总结:

以下四项为可靠数据传输的四要素。

校验和:(UDP中就有的)发送方求发送数据的16bit字之和的反码得到校验和,将校验和与数据一同发送到接收方,接收方将受到的数据进行16bit字求和,再加上校验和,若为0说明接收到了正确的数据,若不为0,则说明传输过程有bit差错。

ACK/NAK:(rdt 2.0 加入)肯定确认和否定确认,接收方收到数据之后,用校验和进行校验,如果数据正确则回复ACK,错误则回复NAK。

序号:(rdt 2.1加入)将发送的分组以0和1编号(用发送序号+1 mod 2得到,如第3个发送的包其序号为4 mod 2=0),该序号只是为了区分相邻两个分组,以及是正常发送还是重传。

如接收方接收到了序号为0的分组,反馈一个ACK,但ACK中途丢包,发送方因为超时而重传,接收方再次接收到序号为0的分组,由于此时接收方在等待序号为1的分组,所有接收方就不会将这个冗余的分组交付到上层,但仍会回复该分组的ACK。

定时器:(rdt 3.0加入)传输过程中可能存在分组丢失的情况(如路由器缓存满时,将丢掉后来的包),发送方需要等待接收方确认分组是否丢失,来判断是否重传,这段等待时间不是一个定值(因为网络时延不确定),有可能等待很久才能收到,甚至超过再重传一次的时间,所以rdt 3.0加入了定时器,在发送每个分组时启动一个倒计时,如果在倒计时为0时还未收到反馈,则重传给分组。

\\\\\\\\\\\\\\\\\\流水线可靠数据传输

rdt 3.0已经实现了可靠数据传输,但是它是一个停等协议,即在传输过程中需要停下来等待接收方反馈丢包信息。

假设一个分组的传输时延(将数据从节点推送到链路的时间)为0.008ms,而往返传播时延RTT为30ms,那么传输一个分组,主机需要等待至少30ms的时间,而将分组推送到链路只需要0.008ms,这样主机的利用其实很低。

为了解决这个性能问题,出现了流水线可靠数据传输协议,它不是停等协议,允许发送方发送多个分组而不需要等待确认(尽管最后还是要确认,但不需要等待)。

为了实现流水线,必须:

增加序号范围

发送方和接收方缓存多个分组

实现差错恢复(分组丢失,损坏,延时过大)——回退N步和选择重传。

回退N步:

选择重传:

面向连接的传输

拥塞控制原理

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: