Published on

计算机基础之运输层

Authors
  • avatar
    Name
    noodles
    每个人的花期不同,不必在乎别人比你提前拥有

简介

运输层提供了运行在不同主机上的应用进程之间的逻辑通信,应用程序通过逻辑通信,运行在不同进程的主机好像直连一样(例如输出一个URI 就能找到对应主机的资源)。 运输层是直接与应用层打交道的网络层级。通过对运输层协议(TCP/UDP)的了解和传输机制的学习,能更好的帮助我们理解应用程序的行为。在阅读计算机网络自顶向下方法的运输层时整理了如下的笔记。

运输层基础

运输层通过多路复用与多路分解来实现将主机间的数据交付服务扩展成主机的进程间的交付服务。它对应用层提供了两种服务类型:

  • 基于连接的,可靠地服务(TCP)
  • 不基于连接的,不可靠的服务(UDP)

TCP

TCP报文段结构

TCP
  • 端口和目的端口用于TCP数据的多路复用和多路分解
  • 序号和确认号用于实现可靠数据传输
  • TCP的连接状态保存在端系统中,这种链接的状态对网络层是不可见的。网络层只看到的数据报
  • 确认号可以理解成发送方期待接受方发送的下一段序列的初始字节编号。例如当A收到B发送的数据是500-600(不包括600)并且在累计确认下(前500的数据都得到确认) B在发送的报文中确认号就是600,A接收到报文后就会发送600之后的数据给B
  • 接收窗口用于实现拥塞控制(TCP慢启动)
  • 在6个标志字段中 ACK用于确认上一个已成功报文的确认 RST,SYN,FIN 用于连接的建立和拆除 PSH被设置的时候标志接受方应立即将数据交付给上层

流量控制

流量控制是发送方与接收方的一种速度匹配服务。在发送方与接收方都维持一个接收窗口的变量。

TCP连接的建立与中断

TCP连接的建立

三次握手
  1. 客户端在向服务端请求连接的时候,会向服务端发送一个SYN报文段。会随机选取一个client_isn作为序号字段放置在该SYN报文中。
  2. 服务端在收到该报文后,会发送给客户端一个报文并且设置TCP的缓存和变量。该报文的ack字段是client_isn + 1,序号字段为server_isn,SYN比特为设置成1.代表当前服务器已经准备接收数据
  3. 客户端在接收服务端的确认报文后会创建TCP的缓存和变量并且向服务端继续发送报文(此时的报文可以携带上上层的数据),其中ack字段是server_isn + 1,序号字段是client_isn + 1,SYN字段为0(此后的报文中SYN字段都为0).至此TCP连接建立成功。(三次握手是为了确定双方的序号)

TCP连接的中断

TCP close
(发送方和接受方都可以中断TCP连接)
  1. 终止方向另一端发送一个TCP报文,其FIN比特位被设置成1
  2. 接收方回复一个ACK报文并且发送一个FIN报文
  3. 终止端回复一个ACK报文,至此两方为了维持TCP连接的缓存和变量都将清除(接受FIN端需要把自己剩余的信息发送完 才能发送FIN报文)

TCP客户端和服务端的状态转变

TCP客户端客户端状态的改变
客户端状态变化
  1. 连接的建立 初始的时候TCP客户端处于CLOSED,当它需要与服务端建立TCP连接的时候,发送SYN字段,进入SYN_SENT状态. 当收到服务端对SYN报文的确认后,就进入ESTABLISHED状态,此刻TCP客户已经能发送和接收数据了
  2. 连接的中断 客户端发送TCP报文(FIN字段被设置为1),进入FIN_WAIT_1,等待服务端的确认报文然后进入FIN_WAIT_2.等到服务端的FIN报文并且发送确认报文后,进入TIME_WAIT.最后进入CLOSED状态
TCP服务端状态的改变
服务端变化
理解TIME_WAIT状态
  1. 可靠的实现TCP全双工连接的终止 主要close的一端 需要维持状态以防止最后一次的ACK对方收不到来进行网络重传
  2. TIME_WAIT阶段设置的超时时间会导致网络中迷失的分组丢失,这样在同样的端口创建新的TCP连接时候,不需要判断之前的数据.

拥塞控制

TCP使用的是端到端的拥塞控制,来防止网络拥塞时发生的各种问题(多余的分组,丢包等)。相比流量控制,拥塞控制是对网络拥塞的一种感知来控制发送的速度。流量控制是对接受方处理速度的一种速度调整。 在TCP发送方维护一个拥塞窗口的变量来实现拥塞控制
LastByteSent - LastByteAcked 小于 接收窗口和拥塞窗口

  • 当发送方正确的收到确认报文的时候,他认为网络中无拥塞,不断的调整 cwnd
  • 当发送方超时未收到ack或者收到接收方三次冗余,需要降低发送速度

基础词汇解释

MSS 最大报文段长度
在不同的链路层协议上,其最大的传输单元(最大链路层帧长度)不同,这就导致了在封装到IP数据报的时候,需要适应底层的链路层长度。

TCP UDP 区别

  1. TCP提供差错校验,重传等功能 UDP不提供对应的功能,UDP需要在应用程序中添加对应的逻辑来完成相应的功能
  2. UDP的数据报长度字段会随着数据发送给接收端,TCP是一种字节流协议,没有记录标记的长度(content-length) 主要是两者实现方式上的不同UDP是不面向连接的 也就是可以从一个套接字接受多个数据源 如果没有长度加以区分数据就会混乱.一个TCP套接字只对应着一个数据源,可以由应用层来决定数据的读取.