多路复用和多路分用
因为网络层只有一个IP协议,而应用层则有HTTP,SMTP等各种协议。因此为了将消息合并/分解就需要传输层进行多路复用/分用。
多路分用
无连接分用—UDP
一个进程至少有一个端口号,一个端口号对应一个socket。
一个UDPsocket包含了SP(源端口号)和DP(目标端口号)两个标识。
面向连接分用—TCP
在运输层中面向连接的网络传输多使用TCP,而TCP套接字和UDP套接字之间有一个细微的差别,就是,TCP套接字是由一个四元组(源IP地址、源端口号,目的IP地址,目的端口号)来标识的。
注意:与UDP不同的是,两个具有不同源IP或源端口号的到达的TCP报文段将被重定向到两个不同的套接字。这也就是为什么TCP套接字需要四元组数据标识的原因,如果只用两元组就无法分别是否报文来自于同一个IP。
而为什么TCP需要重定向到两个套接字呢?原因如下:
当一个UDP服务器接收到一个UDP报文段时,它会根据收到的UDP报文段的源IP和源端口号,把数据发送回客户端,它并不需要创建一个新的套接字来处理该报文段;
而对于一个TCP服务器,当它接受一个连接时,它会产生一个新的套接字,然后通过新的套接字来与客户端通信,也就是通过新的套接字来把数据发送回给客户端。由于每一个连接都会产生一个新的套接字,所以具有不同的源IP或源端口号的连接就是一个不同的连接,对应着产生的新的不同的套接字。
—–计算机网络运输层之多路复用与多路分解
总结下来就是因为TCP需要建立连接。
UDP
UDP协议主要的工作有两个,一个是复用和分用,另一个就是简单的错误校验(一定程度上保证端到端的正确性)。由于是基于IP协议,并未增加过多的校验工作,因此UDP属于BEST EFFORT服务,也就是说消息段可能会存在丢失和非按序到达的情况。
另一方面,由于不需要握手连接也不用校验太多,UDP的传输延迟小,速度快,成为了其优势。
UDP消息段结构
如图所示,UDP消息段主要是在原应用层消息上增加了2个Byte的头。分别包含了SP,DP,Len和校验和。
checksum校验和
校验和的原理是对消息视为16bit整数,然后求和按位求反,保存在checksum中。接收方再通过该和进行检查。这种校验方法说明,校验和不等则一定有错,校验和相等则可能没错。因此是一种简单的校验。
TCP
可靠数据传输原理
要求:数据不错不丢不乱。不仅仅是针对传输层,网络层也有保证可靠数据传输的需求。
如下图所示,可靠数据传输的原理可以用有限状态机FSM来描述。
红线上为条件event,红线下为执行的操作actions。
假设信道会产生位错误—目的:不错
如果信道会产生位错误,则可以利用:校验和,ACK/NAK(确认机制)和重传(ARQ)来保障错误。
rdt2.0
如图所示为初步FSM。通过该图,可以看出sender会打包发送数据和校验和sndpkt,然后进入等待状态。receiver会接收rcvpkt(就是sndpkt),然后进行校验.如果成功,发送成功信号ACK并提取数据;如果失败,则发送NAK并继续等待。sender这边则根据收到的是NAK还是ACK来决定是重发还是进入新一轮数据发送。
rdt2.1
考虑到ACK和NAK信号也有可能产生错误。因此引入2.1版本,将发送数据编号并将ACK/NAK加上校验和,只有等到正确的ACK,sender才会进入下一状态,如果是错误的信号或者是NAK则继续重传。为什么要编号呢?—目的:不乱为了让receiver知道sender发的是哪个数据,避免重复接收相同数据。另一方面,由于sender是停等协议,因此只需要01两种状态就可以了。
上图为sender的FSM。corrupt()用于检测回来的信号是否坏掉,如果坏掉则重发。
上图为receiver的FSM。当sender发送0号消息时,receiver处于0号消息等待状态。此时,如果0号消息坏掉,则发送NAK,如果成功,发送ACK。接下来是等待消息1。这时候看sender,如果sender接受的0号消息的ACK是损坏的,那么sender会重发一个0号消息。这时候编号就有用了,处于等待1号消息的receiver接到了0号消息,那么他会继续发ACK,但不采取其他操作(右下角的循环状态)。这时sender会收到新的ACK进入消息1的发送,那么整个FSM就可以运行下去了。
rdt2.2
其实有了编号后,我们是可以把NAK状态取消的,只要把ACK的状态也编号,变为0/1就行。
如上图。对比rdt2.1可以看到,对于发送了0号消息的sender,除非收到返回的0号ACK,其他ACK或者错误都会继续重发。而receiver也得到了简化,对等待0/1状态,如果不正确,则发送另一个(1/0)ACK。
假设信道会产生位错误,并且会丢包—目的:不丢
rdt3.0
这时候我们可以加入定时器,如果一段时间没反应则自动重发。receiver不用改动,只用改动sender。如下图。