计算机网络传输层概念及其协议

一、概念

       链路层保证的是点到点的可靠传输,传输层保证端到端的可靠性。
       传输层是进程之间的通信。
       传输实体:在收/发两端的传输层实现对等实体通信的硬件或软件。
       实现TCP协议的用户进程或者硬件称为TCP的传输实体。

二、TCP协议

1.概念

       TCP连接的性质:
       ①面向连接。
       ②全双工。
       ③Unicast(单播):只支持两端点之间的通信,不支持Multicast(多播)和Broadcast(广播)。
       ④面向字节流。

       TCP协议的端口的定义:
       ①用16bit区分2^16个端口。
       ②众所周知端口:全局分配,用于标准服务器,取值小于1024。
       ③临时端口:本地分配(主机建立连接时为用户进程动态分配的端口),取值大于1024。
       端口号用于进程寻址。
       socket通信:通过ip地址访问到目标主机,再根据端口号访问到对方主机的某个进程。

       TCP保留端口号举例:
TCP保留端口号举例
       TCP的封装:
在这里插入图片描述

2.TCP报文结构

       TCP协议报文格式:首部+应用数据
       主要看TCP首部的结构:
在这里插入图片描述
       (1)源端口号和目的端口号:分别表示TCP报文段来自于哪一个应用进程和要到目的主机的哪一个进程。
       序列号:TCP报文段是要被封装在IP分组中投递的,而IP分组在投递的过程中是有可能乱序和丢失的,为了能够使乱序和丢失的报文重传重排报文段,TCP报文必须自己给自己编号,所以序列号就是TCP报文段自己给自己的编号。

       (2)确认号:确认号是接收端的tcp实体用于向对方确认已经收到了哪一个序列号的报文而希望收到的下一个报文段的编号

       (3)偏移:TCP报文段的头部长度,以四字节为单位。例如偏移是10,则TCP报文段长度为40个字节。

       (4)标志位:6bit

       ①bit1:URG(urgent)位,当URG=1时,紧急指针域有效,为0则无效。
       紧急指针字段:16bit,存放数据部分需要被紧急处理的那一部分的最后一个字节的字节编号。

       ②bit2:ACK(acknowledge)位,当ACK=1时,确认序号有效。

       ③bit3:PSH位,在整个的TCP报文段当中,接收方在接收了多个TCP报文段时,会将TCP报文段进行缓冲,缓冲到一定长度之后才会向上交给应用层去处理,当某一个TCP报文段需要被整段的紧急处理时,很显然它不希望被缓冲在接收方的缓冲区里,这时候它就将它的PSH位置1,这时接收方在收到了这个TCP报文段时,就不用等到缓冲区满才将它上传给它的上一层应用程序。

       ④bit4:RST位,用于当连接崩溃或出现错误连接时用于连接复位。

       ⑤bit5:SYN位,即同步比特,同于建立连接时使用(三次握手),为1表示请求建立连接,如果对方同意建立连接,就会也返回一个SYN=1的TCP报文段,如果对方不同意建立连接,就返回SYN=1,ACK=0的TCP报文段,这样接收方就可以区分发送方是否请求与她建立了连接,发送方也可以确认接收方是否同意与她建立连接。

       ⑥bit6:FIN位,断开连接时使用(四次挥手),发送方发送FIN=0的TCP报文段表示请求断开连接,接收方如果同意断开连接也向发送方发送FIN=0的TCP报文段,如果接收方不同意,则发送FIN=0的TCP报文段。

       ⑦窗口字段:接收端向发送端发送的用于控制发送端的发送的报文段的尺寸,防止接收端的缓冲区溢出(结合滑动窗口理解)

       ⑧校验和字段:对整个TCP报文段进行校验。

3.TCP的流量控制和拥塞控制

       (1)滑动窗口进行流量控制

       TCP通过滑动窗口进行流量控制,即发送端可以连续发送走多个TCP报文段,只要是在TCP发送窗口当中的都可以发送走。接收端也有一个接收窗口,只有在接收窗口中的TCP报文段接收方才会成功接收并且返回ACK给发送方,这样发送端就可以确认这一报文段已经被成功接收,那么已经被ACK过的报文段就可以出发送窗口,使得发送窗口继续向下滑动了。
在这里插入图片描述

       (2)TCP的拥塞控制

       当TCP报文段传输的过程中产生拥塞时,我们希望发送端减少或减缓发送,使得发送压力不是那么大,具体的做法可以使用TCP的拥塞控制:

       在发送方设定一个拥塞窗口(cwnd),拥塞窗口的初值等于发送窗口(swnd)的大小,在一个超时计时器时间内,最多能够发送的报文段的多少就由拥塞窗口决定。再设定一个阈值(ssthresh),用于控制拥塞窗口的大小,拥塞窗口的大小应该小于等于这个阈值。

       当cwnd<ssthresh时,若每一个RTT(往返时延)内,都能正确接收报文,cwnd加倍(慢开始)。若超时,说明出现拥塞,启动拥塞避免算法。
       当cwnd>ssthresh时,每经过RTT,若能正确接收报文,cwnd加1(拥塞避免)。
       当cwnd=ssthresh时,每经过RTT,若能正确接收报文,cwnd加倍也可以,加1也可以(即慢开始和拥塞避免都可以)。

       TCP拥塞控制包括四个核心算法:慢开始,拥塞避免,快重传和快恢复。
       慢开始的主要思想:一开始不发送大量的数据,而是从小到大的逐渐增加拥塞窗口的大小,从而试探网络的拥塞程度。
       拥塞避免的主要思想:即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加 1。
       快重传的思想:接收方收到一个失序的报文段就立即出发重复确认,发送方连续收到3个重复确认就立即重传对方尚未收到的报文段,而不用等重传计时器的时间。
       快恢复的思想:发送方收到3个重传确认时,立即执行“乘法减小”算法,即ssthresh门限减半(1/2)。接下来,并不执行慢开始算法(cwind置1),而是将cwnd置为ssthresh,然后执行拥塞避免算法。

       拥塞控制的例子:
在这里插入图片描述
       当TCP连接进行初始化时,把拥塞窗口cwnd置为1.为了便于理解,图中的窗口单位不使用字节而使用报文段的个数。在本例中,慢开始门限的初始值设置为16个报文段,即ssthresh=16.。在执行慢开始算法时,发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1,然后开始下一轮的传输(上图中横坐标是传输轮次,不是时间)。因此拥塞窗口cwnd随着传输轮次按指数规律增长。当拥塞窗口cwnd增长到慢开始门限值ssthresh时(图中点①,此时拥塞窗口cwnd=16),就改为执行拥塞避免算法,拥塞窗口按线性规律增长。但是“拥塞避免”并非完全能够避免拥塞。“拥塞避免”是说把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
       当拥塞窗口cwnd=24时,网络出现了超时(图中的点②),发送方判断为网络拥塞。于是调整门限值ssthresh = cwnd/2=12,同时设置拥塞窗口cwnd=1,进入慢开始阶段。
       按照慢开始算法,发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值加1。当拥塞窗口cwnd=ssthresh=12时(图中的点③,这是新的ssthresh值),改为执行拥塞避免算法,拥塞窗口按线性增大。
当拥塞窗口cwnd=16时(图中的点④),出现了一个新的情况,就是发送方一连收到3个对同一个报文段的重复确认(图中的3-ACK)。关于这个问题要解释下:
       有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞。这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,因而降低了传输效率。所以采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。

       因此,在上图中的点④,发送方知道现在只是丢失了个别的报文段。于是不启动慢开始,而是执行快恢复算法。这时,发送方调整门限值ssthresh=cwnd/2=8,同时设置拥塞窗口cwnd=ssthresh=8(图中点⑤),并开始执行拥塞避免算法。

       TCP Reno是快恢复算法,TCP Tahao是慢开始算法。

TCP拥塞控制流程图

       关于TCP协议的三次握手和四次挥手就不再记录了,网上有好多非常好的文章。这篇记录传输层的文章写的让人看起来不怎么赏心悦目,以后有时间在改改,补补。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值