运输层
进程之间的通信,在IP层,进行通信的就是两个主机,而在运输层,进行通信的却是两个进程,这就涉及到运输层的一个复用和分用的问题了,也就是发送方将不同的进程都用一个运输层协议传送数据,而分用是指将一个协议数据分出来给各个进程使用;
运输层还要对收到的报文进行差错检测:两种不同的运输协议,无连接的UDP和有连接的TCP;
UDP和TCP的区别:
我们知道,在网络层,都是不可靠的传输,但是在运输层,有连接的TCP是一条可靠的全双工信道,而无连接的UDP依然是一条不可靠信道;
运输层的两个协议:
用户数据报协议(UDP);传输控制协议(TCP);
两个对等运输实体在通信时传送的数据单位叫做运输协议数据单元;
UDP在建立之前不需要建立连接;
TCP提供面向连接的服务;
在主机上的多种进程中,我们要如何去识别我们要用哪个进程呢?这就要用到端口的知;
端口具有本地性,只有本地意义,不同的计算机上是可以有同样的端口的;
端口分为两类;
服务器端使用的端口号;客户端使用的端口号;
服务器端:这是一些常用的服务器端口号;如FTP:21;HTTP:80;
客户端:(短暂端口号)通信结束之后,就可以给其他进程用了;
用户数据报协议UDP;
特点:无连接;尽最大努力交付;面向报文;没有拥塞控制;支持1对1,1对多,多对1和多对多的交互通信;UDP的首部开销小;
传输控制协议TCP:
主要特点:面向连接;只能有两个端口,只能是点对点;支持可靠交付的服务;提供全双工通信;面向字节流;
其中提供全双工通行的意思是指:TCP允许通信双方的应用进程在任何时候都能发送数据,TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据;
套接字:即端口号加上IP地址即为套接字;
同一个IP地址可以有多个不通过的TCP连接,而通过一个端口号可以出现在多个不同的TCP连接中;
可靠运输的工作原理;
在理解可靠运输之前, 我们先了解一下什么是不可靠运输;即,传输信道产生差错,不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据;
停止等待协议;
概念:发送一个分组之后就停止发送,等待对方的确认,在收到确认之后再发送下一个分组;
超时重传:发送方只要过了一段时间没有收到确认,就认为刚才发送的分组丢失了,重传前面发送的分组;
停止等待协议:发送方每发送一个分组,就进入超时重传状态,收到确认之后就撤销,然后再发送下一个分组;
注意三点:
1,A在发送出去之后,必须先保留一份副本;
2,分组和确认分组都必须进行编号;
3,超时计时器应该比数据在分组中传输的往返时间更长一些;
确认丢失和确认迟到:
现在就有一种情况,B在收到
1,丢失这个重复的分组M1,不向上层交付;
2,向A发送确认,
信道利用率:
一般来说,使用停止等待协议比较简单,当缺点就是信道利用率太低了,所以我们使用了更高效的传输,流水线传输,由发送发连续发送多个分组,不必等收到确认之后在发送;
而使用流水线传输,就要使用连续ARQ协议和滑动窗口协议 ;
对于连续ARQ协议来说;
发送方:每收到一个分组,就把发送窗口向前滑动一个窗口,实现分组,
接收方:不必对收到的分组逐个发送确认,采用累积确认的方式,对按序到达的最后一个分组发送确认;
TCP报文段的首部格式:
确认ACK:仅当ACK=1时确认号字段才有效;当ACK=0,确认号无效,TCP规定,在连接建立后所有传送的报文段都必须把ACK置1;
同步SYN:在连接建立时用来同步序号,当SYN=1而ACK=0时,表明这是一个连接请求字段,对方若同意 建立连接,则应在响应的报文中使SYN =1和ACK=1.因此,把SYN置为1就表示这是一个连接请求或连接接受报文;
终止FIN:用来释放一个连接,当FIN=1时,表明此报文段的发送方的数据已发送完毕;并要求释放运输连接;
这个时候,我们就要讨论一下三次握手,四次分手;
三次握手来建立连接,
首先:男方先发出SYN= 1,提出牵手的询问;
然后:女方回应SYN=1,ACK=1;也就是说我同意你的牵手啦,并向男方的伸出了一双手;
最后:男方回应ACK=1,牵手成功啦~~~
四次分手来释放连接,(比较复杂一点)
男方:发出FIN,提出分手,进入FIN-WAIT-1状态;男方提出了分手,并做好了被骂的准备;
女方:发送ACK=1,把该发的数据发完,敲里妈,渣男什么都发送过去;
男方:打不还手,骂不还口;进入FIN-WAIT-2状态;
女方:发送FIN =1,ACK=1,好了,我已经知道了,记住是我先甩了你。。
男方:发送ACK=1,好吧,我已经知道你甩了我了,我就等等,看你会不会想不开什么的。。。
进入LAST-ACK(最后确认阶段)
女方:挂了电话。。。
男方:等了十分钟后,确定对方没死,又去牵手下一个了。。。
注意:窗口字段明确指出了现在允许对方发送的数据量,窗口值司经常在动态变化着;
TCP可靠传输的实现;
A方的发送窗口:在没有收到B的确认情况下,A可以连续把窗口的数据都发送出去,凡是已经发送过的数据,在没有收到确认之前都进行副本备份;
发送窗口的后面表示已经发送且收到了确认,窗口前面表示还没发送的数据;
在窗口的里面,前半部分表示允许发送但还没发送的数据,后半部分表示已经发送但还没收到确认的数据;
对于发送窗口中的数据,如果没有按序到达的情况出现,怎么办?
对于接收方,对于没有按序到达的数据,就只按照收到的数据的最高序号给出确认,向发送方再次索取,如果收到了正确的数据,就把原来的清空掉,然后再填入正确的数据;
如何判断收到的确认报文是最先发送的报文段的确认,还是后来重传的报文段的确认?
因为确认是最先发送的,还是重传的确认,对于超时重传的时间选择是非常重要的;
所以提出这样的规定,对于重传的报文段,就不采用其往返时间样本;
TCP的流量控制;
所谓流量控制,就是让发送方的发送速率不要太快,要让接收方来得及接受;
让发送方的发送窗口不能超过接收方给出的接受窗口的数值;
TCP的拥塞控制:
拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载;是一个全局的过程,而流量控制,往往指点对点通信量的控制,是个端到端的问题,解决的是一条线的问题,而拥塞控制是解决一张网的问题;
几种拥塞控制的方法:慢开始,拥塞避免,快重传,快恢复;
发送方让自己的发送窗口等于拥塞窗口;
发送方控制拥塞窗口的原则:只要没有拥塞,就把发送窗口扩大,出现拥塞, 拥塞窗口就减小;
慢开始算法:一开始发送端口(cwnd)只有一个1个单位,在收到确认之后,就加1,变成两个单位,发送两个报文,再次收到确认后,就加2,发送四个报文了;就这样指数倍地加上去。。。
这里的慢并不是指增长速度慢,而是一开始的时候是以1个单位作为开始的。
对比拥塞避免算法:每次收到确认,就把拥塞窗口加1,不是呈指数倍增加,而是呈现线性增长,这就是拥塞避免算法,这样做,绝壁是可以避免拥塞的了。。。
满开始和拥塞避免算法的实现举例;
一开始,先用慢开始,升到sshresh(慢开始门限)的初始值之后,就使用拥塞避免算法,做线性增长,然后出现了网络拥塞之后,把sshresh的值设置为除以2的值,来做为新的sshresh的值,然后再用慢开始,重新来过。
这里涉及到一个乘法减小和加法增大;
快重传和快恢复:
快恢复算法:
区别之处在于:在出现了拥塞之后,不是将ssthresh的初始值设为0,而是将sstresh的值设置为原ssthresh的值的一半,然后开始执行的是拥塞算法,即线性增强;
所以,从前的那个拥塞之后就把ssthresh的值设置为0,然后在重新开始的版本已经淘汰不用了,而是将ssthresh的值减半,然后直接用线性增长的方式;
记得:发送方的发送窗口一定不能超过对方给出的接受窗口值rwnd;