运输层向它上面的应用层提供通信服务。
我们知道,IP协议能够把主机A发送出的分组按照首部中的目的地址交付到目的主机B中,为什么还需要运输层?
真正通信的主体是在主机中的进程,即A主机的一个进程与B主机的一个进程通信。然而IP协议只能把分组送到目的主机,但却不能交付给主机中的应用进程,而是停留在主机的网络层。在这里先引入复用和分用的概念。
复用: 指在发送方不同的应用程序都可以使用同一个运输层协议传送数据(需要加上适当的首部)。
分用: 指接收方的运输层在剥去报文的首部后能够把这些数据正确交付给目的应用程序。
举个例子:假设一个机构的所有部门向外发出的文件由收发室负责寄出,这就相当于各部门在“复用”这个收发室,当收发室收到外来的文件,则要完成“分用”的功能。
何为逻辑通信?
意思是:从应用层看,只要应用层把报文交给下面的运输层,运输层就可以把这报文传送到对面的运输层。
事实上,在逻辑通信的过程中,IP层也起到作用,因为两个运输层之间的数据传送并非是直接传送,而是经过IP层的传送。
所以:网络层是为主机之间提供逻辑通信,运输层是为应用程序提供端到端的逻辑通信。
此外,运输层还要对收到的报文进行差错检测。
前面提到,IP层用IP地址来区分,把数据报交付到目的主机,运输层(TCP,UDP)则处理源主机的进程和目的主机的进程通信,通信目标的判定就是使用端口号,使用端口号来区分进程。
结合起来就是:用 IP地址(为了找到对方的计算机)+传输层协议+端口号(找到对方计算机中的应用程序) 来区分与谁进行通信。
这类端口仅在客户进程运行时动态选择,因此又称短暂端口号。
当服务器进程收到客户进程报文时就知道客户进程的端口号了,因而可以把数据发送给客户进程。通信结束后,刚才使用过的客户端口号就不存在了。
用户数据报UDP有两个字段:数据字段和首部字段。
由四个字段组成,每个字段都是两个字节。
检验和的计算方法:在UDP用户数据报之前增加12个字节的伪首部。
相关计算过程就不详谈了,有兴趣的可以戳:http://royliu.xyz/2018/03/15/手动计算UDP协议校验和/
每一条TCP连接有两个端点。这个端点叫做套接字(socket)。 端口号拼接到IP地址就构成了套接字。
套接字 socket = (IP地址: 端口号)
TCP的连接被两个端点所确定:
TCP连接:: = {socket1,socket2} = {(IP1: port1),(IP2: port2)}
运输连接有三个阶段:连接建立,数据传送,连接释放。
握手数据:
seq:初始序号。
ack:确认号。
SYN和ACK:报文段中的SYN位和ACK位。
挥手数据:
seq:等于前面已传送过的数据的最后一个字节的序号加1
FIN:报文首部的终止控制位FIN
MSL:MSL叫做最长报文段寿命
其余一样。
在这里讲下自己对于为什么进行四次挥手(即TIME-WAIT)的原因吧。
第一,为了保证A发送的最后一个ACK报文段能够到达B。因为报文段有可能丢失,因而处于LAST-ACK状态的B就会超时重传FIN+ACK报文段,而A就能在2MSL时间内收到重传的FIN+ACK报文段,接着A再重传一次确认,重新启动计时器。
第二,防止已失效的连接请求报文。A在发送完最后一个ACK报文段后,再经历2MSL后,就可以使本连接持续的时间内所产生的所有报文都从网络中消失。
通俗大白话来理解TCP协议的三次握手和四次分手
里面也很好阐述了为什么进行三次握手和四次挥手的原因。
图a情况是传输中没有出现差错情况下的,A发送完M1后收到确认再发送下一组。
图b是传输过程中出现差错,这里就采用了超时重传。实现超时重传就要在每发送完一个分组时设置一个超时计时器,如果在计时器到期之前收到对方的确认,就撤销已设置的超时计时器。
图a如所示,B接收到,但是回应确认消息的时候丢失,这时候A的超时计时器到期了,就又发送了M1,这时候B会丢弃重复的M1,再次重传确认消息。
图b是B在收到A发送的M1后,B回应确认消息返回给A时迟到了,这时候A又发送一次M1,同样的,B会丢弃M1,再次重传确认。A收到迟到后的确认消息会什么也不做。
使用上述的确认和重传机制,TCP就能在不可靠的传输网络上实现可靠的通信!!!
像上述的这种可靠传输协议常称为自动重传请求ARQ。 意思是重传的请求是自动进行的。
接收方采用累积确认方式。这就是说接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认。 这表示:到这个分组为止的所有分组都已正确收到了。
累积确认的优点: 容易实现,即使确认丢失也不必重传。
缺点: 不能向发送方反映出接收方已经正确收到的所有分组的信息。
举例子:比如发送方发送了前5个分组,而中间第三个分组丢失了,这时候接收方只能对前两个分组发出确认,发送方无法知道后面三个分组的下落,从而只能把后面三个分组重传一次。
TCP报文段首部的前20个字节是固定的。后面有4n字节按序增加。因此最小长度是20字节
小于P1的是已发送并已收到确认的部分,大于P3的是不允许发送的部分
P3-P1=A的发送窗口大小
P2-P1=已发送但尚未收到确认的字节数
P3-P2=允许发送但当前尚未发送的字节数(可用窗口)
窗口和缓存的关系:
发送缓存用来暂时存放:
1.发送应用程序传送给发送方TCP准备发送的数据
2.TCP已经发送出当尚未收到确认的数据
接收缓存用来暂时存放:
1.按序到达的,但尚未被接收应用程序读取的数据
2.未按序到达的数据。
运用了Karn算法
顾名思义,就是接收到的报文段无差错,只是未按序号,那么就只传送缺少的数据而不重传已经正确到达接收方的数据。
流量控制的目的:让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制就可以实现对发送方的流量控制。
就是通过改变接收方的接收窗口大小。以此来进行流量控制。(rwnd意思为接收方窗口即接收窗口)
概念:在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。
拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
拥塞控制算法是向发送端发送控制报文,并告诉发送端,网络出现麻烦,必须放慢发送速率。
拥塞控制是基于窗口实现。发送方维持一个拥塞窗口 的状态变量,拥塞窗口大小取决于网络拥塞程度,并且动态变化。
发送方让自己的发送窗口等于拥塞窗口
判断网络拥塞的依据就是出现了超时,即发送方没有按时收到确认报文。
即主机开始发送数据的时候,由小到大逐渐增大发送窗口。
因为如果开始发送时,立即把大量的数据字节注入网络,那么就有可能因此网络发生拥塞。
那么,窗口应该如何逐渐增大?
增大的倍数是2,也就是说,开始窗口大小为1,发送报文出去收到确认后就变为2,接着4,8,,,,
拥塞避免算法是让拥塞窗口缓慢地增大,即每经过一轮就把发送方的拥塞窗口加1
图中标号4-5出现了异常情况,解析如下(正好是拥塞控制的缺点)。
缺点:有时,个别报文会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,误以为网络发生拥塞。这就导致发送方错误启动慢开始把拥塞窗口设置为1,从而降低了效率。
采用快重传方法可以让发送方今早知道发生了个别报文段的丢失。
规定:发送方只要一连收到3个重复确认,就认为接收方确实没有接受到相对应的报文。此时应该立即进行重传,这样就不会出现超时,发送方也不会误认为出现网络拥堵。
快恢复算法是这样规定:当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始的门限值ssthresh减半,这只是发送方提前预防网络拥塞的措施。
意思就是恢复到上次窗口的大小,即执行乘法减小(Multiplicative Decrease即MD)。与拥塞避免算法相反,拥塞避免算法是加法增大(Additive Increase即AI)。二者合在一起就是AIMD算法。
快重传与快恢复
发送方的窗口上限值=Min{rwnd(接收方窗口),cwnd(拥塞窗口)}
rwnd