计算机网络基础(第三篇:运输层)

今天继续学习运输层,开始之前回顾一下计算机网络的体系架构,想要对计算机网络基础有一个完整的概念,也可以先看看我之前的一篇博客:计算机网络基础(第一篇:概述)


计算机网络的体系架构

在这里插入图片描述


运输层

今天咱们要学习的是运输层,运输层协议包括大名鼎鼎的TCP协议UDP协议

  • TCP是面向连接(划重点要考!!!)、全双工的通信方式,每一个TCP连接是点对点的。TCP提供数据的可靠交付、流量控制、拥塞控制。TCP协议是面向字节流的,即应用层传下俩的报文被看作字节流,被组织成大小不等的数据块!
  • UDP有所不同,它是无连接的通信模式,尽可能最大可能交付数据,没有拥塞控制,支持一对一、一对多、多对一或多对多的通信方式。UDP协议是面向报文的,即应用层传下来的报文不会进行合并或拆分,只是添加UDP首部!

TCP首部格式

在这里插入图片描述

  • 端口:包括源端口(发送端)和目的端口(接收端)
  • 序号:用于对字节流进行标号,例如序号为301,表示第一个字节的编号为301,如哦携带的数据长度为100字节那么下一个报文段的序号应为401
  • 确认号:期望收到的下一个报文段的序号。例如B正确收到A发送来的一个报文段,序号为501,携带的数据长度为200字节,因此B期望下一个报文段的序号为701,B发送给A的确认报文段中确认号就为701
  • 数据偏移:指数据部分在报文段中的偏移量,也就是TCP报文段首部的长度
  • 确认ACK:当ACK=1时确认号字段有效。TCP规定,连接建立之后,所有传送的报文段都必须把ACK置为1
  • 同步SYN:在连接建立时用来同步序号。SYN=1,ACK=0时表示是一个连接请求报文段,。对方同意建立连接,则响应报文段中SYN=1,ACK=1
  • 终止FIN:用来释放一个连接,当FIN=1时,表示此报文段的发送方的数据已发送完毕,要求释放连接
  • 窗口:窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的

UDP首部格式

在这里插入图片描述

  • 源端口:在需要对方回信时选用,不需要时可全用0填充
  • 目的端口:报文段到达接收方交付报文时使用
  • 长度:UDP用户数据报的长度,最小值为8(仅有首部的情况)
  • 检验和:检测UDP用户数据报在传输中是否有错误,存在错误则丢弃该数据

注:在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部。所谓“伪首部”是因为这种伪首部并不是UDP用户数据报的真正的首部。只是在计算检验和时临时添加在UDP用户数据报前面,得到一个临时的UDP用户数据报。检验和就是按照这个临时的UDP用户数据报来计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。

TCP的三次握手

在这里插入图片描述
TCP需要通过三次握手建立连接,以上图为例来看握手的过程,假设客户端A和服务器端B:

  • 首先B处于listen监听状态,等待客户端的连接请求
  • A向B发送连接请求报文,其中SYN=1,ACK=0(表示这是一个连接请求报文),并选择一个初始序号x
  • B收到来自A的连接请求报文,若同意建立连接,则向A发送确认报文,其中SYN=1,ACK=1(表示这是一个响应报文),确认号ack等于来自A的序号值seq加1(即x+1),同时也选择一个初始序号y
  • A收到B的连接确认报文,继续向B发出确认报文,其中ACK=1,确认号ack为y+1,序号为x+1
  • B收到A的确认后,就最终建立起了TCP连接。
    三次握手的原因:为了防止失效的连接请求到达服务器,让服务器错误打开连接。客户端发送的连接请求如果在网络中滞留,呢么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传事件后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的确认报文,不进行第三次握手

TCP的四次挥手

在这里插入图片描述
四次挥手过程:

  • 客户端A发送连接释放报文,其中FIN=1,选取初始序号seq=u
  • B收到之后发出确认报文,此时TCP属于半闭状态(服务器进入CLOSE-WAIT状态),A向B发送数据通道已关闭,但B仍能向A发送报文
  • 当B不再需要连接时,同样需要发送连接释放报文,FIN=1
  • A收到后发出确认,进入TIME-WAIT状态,等待2MSL(最大报文存活时间)后释放连接
  • B收到A的确认后释放连接,则完成了四次挥手

1 四次挥手的原因:客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文
2 TIME_WAIT:客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。原因如下:

  • 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文。
  • 让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。

TCP 滑动窗口

窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。

发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。

接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
在这里插入图片描述

TCP 滑动窗口

流量控制是为了控制发送方发送速率,保证接收方来得及接收。

接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。


博客内容整理自:https://github.com/CyC2018/CS-Notes/blob/master/notes/计算机网络 - 传输层.md

发布了21 篇原创文章 · 获赞 0 · 访问量 528

猜你喜欢

转载自blog.csdn.net/CiaoTigre/article/details/104906311