运输层协议为运行在不一样主机上的应用进程之间提供了逻辑通讯(logic communication)功能。html
网络层提供了主机之间的逻辑通讯,而运输层为运行在不一样的主机上的进程提供了逻辑通讯。缓存
Internet上提供TCP(传输控制协议) 和 UDP(用户数据报协议)两种服务器
一个进程有一个或多个套接字(socket),它至关于从网络向进程传递数据和从进程向网络传递数据的门户。网络
1.无链接的多路复用与多路分解socket
在运输层,无链接的网络传输是经过UDP来实现的,一个UDP套接字是由一个含有目的IP地址和目的端口号的一个二元组来全面标识的。性能
主机收到UDP段后检查段中的目的端口号,并将UDP段导向绑定在该端口号的Socket,所以若是两个UDP报文段有不一样的源IP地址/端口号,却有相同的目的端口号,那么两个报文段将经过相同的目的套接字被定向到相同的目的进程。ui
2.面向链接的多路复用与多路分解线程
在运输层中面向链接的网络传输多使用TCP,而TCP套接字和UDP套接字之间有一个细微的差异,TCP套接字是由一个四元组(源IP地址、源端口号,目的IP地址,目的端口号)来标识的。当一个TCP报文段从网络到达一台主机时,主机会使用所有4个值来将报文段定向,即多路分解到相应的套接字。code
UDP的优点htm
UDP报文段结构由RFC 768定义,UDP首部只有4个字段,每一个字段由两个字节组成。
1.经彻底可靠信道的可靠数据传输 :rdt 1.0
有限状态机(FSM) 能够表示有限个状态及在这些状态之间的转移和动做等行为的数学模型,下图即表示发送方和接收方的有限状态机,底层信道是彻底可靠的,发送方和接收方有各自的FSM,每一个FSM都只有一个状态。
(图解:FSM描述中的箭头指示了协议从一个状态变迁到另外一个状态。引发变迁的事件显示在横线的上方,事件发生时所采用的运动显示在横线的下方。FSM的初始状态用虚线表示。)
2.经具备比特差错信道的可靠数据传输: rdt2.0
下图为rdt 2.0 的有限状态机描述图,该数据传输协议(自动重传请求协议)采用了差错检测、确定确认与否认确认。
rdt_send(data)
事件时:
sndpkt = make_pkt(data, checksum)
产生一个包含待发送数据且带有校验和的分组udt_send(sndpkt)
发送到信道中rdt_rcv(rcvpkt) && isACK(rcvpkt)
),那么发送方知道最近一个分组已经被正确接收,所以协议返回左边状态,继续等待下一次由较高层传下来的数据发送请求rdt_rcv(rcvpkt) && isNAK(rcvpkt)
),那么发送端知道接收端接收到的分组是受损的,因此调用 udt_send(sndpkt)
从新发送该分组,而后状态不变,继续等待接收接收端的 ACK 或 NAK 分组。在上述协议中,当发送方处于等待ACK或NAK状态时,它不能从上层得到更多数据。这样子的协议被称为停等协议 (stop-and-wait)。
rdt_rcv(rcvpkt) && corrupt(rcvpkt)
,则返回 NAK 分组rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
,则返回 ACK 分组3.经具备比特差错的丢包信道的可靠数据传输 rdt 3.0
在现实的网络环境中,除了比特受损外,底层信道还会丢包;有不少可能的方法能够解决丢包问题,这里咱们让发送方负责检测和恢复丢包工做。
假定发送端传输一个数据分组,该分组发生丢失 或者 接收端对该分组的 ACK 发生了丢失。在这两种状况下,发送端都收不到应当到来的接收端的响应。因此,若是发送端愿意等待足够长的时间以肯定该分组缺失已丢失,则它只须要重传该数据分组便可。
从发送端的观点来看,重传是一个万能灵药。为了实现基于时间的重传机制,须要一个倒数计时器 (countdown timer),在一个给定的时间量过时以后,可中断发送方。发送方须要作到:1)每次发送一个分组(包括第一次分组和重传分组)时,就启动一个定时器;2)相应定时器中断;3)终止定时器。
下图是rdt 3.0
的发送方FSM,该协议运行在可能发生出错和丢失的信道上。
rdt 2.2 协议中的接收端有限状态机描述图仍然适用于 rdt 3.0 协议,下面我仍然用文字来简要描述一下上图中的发送端发送分组流程:
rdt_send(data)
事件,经过 sndpkt = make_pkt(0, data, checksum)
产生一个序号为 0,包含待发送数据且带有校验和的分组,接着经过 udt_send(sndpkt)
将其发送到信道中并启动定时器,而后状态变迁为“等待接收接收端的 ACK 0”corrupt(rcvpkt)
)或者收到了 ACK 1(即 isACK(rcvpkt, 1)
,也就是收到了本身发送的上一个分组的 ACK),则直接忽略udt_send(sndpkt)
从新发送该分组并从新启动定时器停等协议可能会限制底层网络硬件所提供的能力
解决方法是:不使用中止等待方式,运行发送方发送多个分组而无需等待确认。因为许多从发送方向接收方输送的分组能够被当作是填充到一条流水线中,所以这种技术被称为流水线 (pipelining)。固然,流水线会增长协议的复杂度:
由于信道中的分组要有一个惟一的序号,会有多个分组在信道中未被确认。
发送方至少应该缓存已经发送却尚未被确认的分组。接受方也许应该缓存已经正确接收的分组。
解决流水线差错错误的两种基本思路:回退N步和选择重传。
GBN 协议被称为滑动窗口协议 (silding-window protocol)
选择重传协议让发送方仅重传那些它怀疑在接收方出错的分组,避免了不须要的重传。
参考:
http://www.javashuo.com/article/p-yuhpatdu-gx.html
http://www.javashuo.com/article/p-paehuxac-kw.html
https://www.cnblogs.com/huahuahu/p/liu-shui-xian-ke-kao-shu-ju-chuan-shu-xie-yi.html