传输层

概述

传输层向它上面的应用层提供通信服务

  • 从传输层看,通信的真正端点不是主机而是主机中的进程

传输层有一个很重要的功能:复用(multiplexing)和分用(demultiplexing)

  • 复用:应用层的所有应用程序都可以通过传输层再传送到网络层

  • 分用:传输层从网络层收到发送给各应用程序的数据后,必须交付指明的各应用程序

运输层提供应用进程间的逻辑通信

  • 数据的传送好像是沿着水平方向传送的

  • 网络层为主机之间提供逻辑通信

《计算机网络》学习总结——运输层、TCP与UDP(详细理解)_为什么要提供两种tcp udp2中协议_羊and船的博客-CSDN博客

传输层会对收到的报文进行差错检测

传输层有两种不同的运输协议:

  1. 面向连接的TCP

  2. 无连接的UDP

传输层向高层用户屏蔽了下面网络核心的细节,使得应用进程看见的就是好像在两个运输层实体之间有一条端对端的逻辑通信信道

  • 传输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的,但这种逻辑通信信道相当于一条全双工的可靠信道

  • 传输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道

传输层的两个协议

传输层有两种不同的运输协议:

  1. 面向连接的TCP(传输控制协议)

    • 传送数据前要先建立连接,数据传送结束后要释放连接

    • 不提供广播或多播服务

  2. 无连接的UDP(用户数据报协议)

    • 传送数据前不需要先建立连接,远地主机收到UDP报文后不需要确认

端口

TCP和UDP都是用端口来跟踪同时穿越网络的不同网络(即不同进程)

端口分配规范:

  1. 0-255保留给TCP和UDP公共应用程序使用

  2. 0-1023是熟知端口,有分发的规范,不应当被随便使用

应用程序 FTP TELNET SMTP DNS TFTP HTTP SNMP SNMP(trap) HTTPS
熟知端口号 21 23 25 53 69 80 161 162 443
  1. 1024-49151可以进行登记使用,避免冲突

  2. 49152-65535为短暂端口号,用于远程通信

套接字Socket

第四层进行通信的单位是进程,由IP和端口共同制定,socket是第四层的地址

  • socket表示为(IP地址,端口)

  • 每个连接都表示为($socket_{source}$,$socket_{destination}$)

  • 通信被认为是以一个socket和另一个socket之间的连接

TCP协议

TCP最主要的特点:

  1. TCP是面向连接的传输层协议

  2. 每一条TCP连接只能由两个端点(endpoint),只能是点对点

  3. TCP提供可靠交付的服务

    • 通过TCP连接传送的数据无差错、不丢失、不重复、按需到达
  4. TCP提供全双工通信

    • 两端都设有发送缓存和接收缓存
  5. 面向字节流

    • TCP把应用程序交下来的数据仅仅看成是一连串的无结构字节流

【图解】三次握手,四次挥手 —— 用心看这一篇就够了-阿里云开发者社区

TCP必须解决的问题:

  1. 可靠传输

  2. 流量控制

    • 滑动窗口

    • 拥塞避免

  3. 连接控制

    • 建立连接:三次握手

    • 断开连接:四次握手

TCP数据报

基本情况:一行4字节,固定首部长度为20字节

  1. 源端口和目的端口

    传输层和应用层的服务接口,各占2字节

    • 复用和分用功能都要通过端口实现
  2. 序号

    TCP传送的数据流中的每一个字节都编上一个编号,序号字段的值指本报文所发送的数据的第一个字节的序号,占4字节

    • 通过序号字段做可靠传输的保证,指示的是TCP传输的比特编码,而不是地址

    • 从小向大进行使用,使用到最大之后会从小再次重新开始分配

  3. 确认号

    期望收到的下一个报文段的数据的第一个字节的序号,用于确认对方的数据号,同时对上一次传输进行确认,占4字节

    • 体现出全双工通信的有点,比如上回收到的最后序号是700,那么确认号就是701
  4. 数据偏移

    指出TCP报文段的数据起始处距TCP报文段的起始处的长度,单位是32位字(即4字节)

    • 不满足的话使用填充位保证为4字节的整数倍
  5. URG

    URG = 1时,表明紧急指针字段有效,告诉系统此报文段中有紧急数据,应尽快传送

  6. ACK

    ACK = 1时确认号字段有效

  7. 推送PSH(PuSH)

    接收TCP收到PSH = 1的报文段,就尽快交付应用进程,而不再等到整个缓存都填满了再向上交付,此时将缓存所有部分都传输

  • TCP在正常情况下并不是马上传输的,而是等到缓存满了才发送
  1. 复位RST

    ReSeT = 1时表明TCP连接中出现严重差错,必须释放连接再重新建立连接

    • 如果请求方发送的请求,如果应答方不想连接则将ReSeT置为1
  2. 同步SYN

    SYN = 1时表明这是一个连接请求或连接接受报文

  3. 终止FIN

    FIN = 1表明此报文段的发送端的数据已发送完毕,并要求释放传输连接

    • 断开连接有四次握手
  4. 窗口

    用来让对方设置发送窗口的依据,表示可以进行传输的窗口大小,单位是字节,占2字节

  5. 校验和

    校验和字段检验的范围包括首部和数据这两部分,占2字节

  6. 紧急指针

    指出在本报文段中紧急数据共有几个字节,占2字节

    • 紧急数据放在本报文段数据的最前面
  7. 选项

    TCP最初只有一种选项,即最大报文段长度MSS(Maximum Segment Size)

    • MSS告诉对方缓存所能接收的报文段的数据字段的最大长度是MSS个字节
    • 数据字段要加上TCP首部才等于整个TCP报文段
  8. 填充字段

    使整个首部长度是4字节的整数倍

主机使用网段(TPDU)交换数据

  • 每个段都有首部20字节 + 0或更多数据字节
  • 段的大小必须与IP数据报匹配,并且必须满足底层的需求

  • 每个字节都有一个32位序号

    • 通讯中商定初识序号,确认到每一位

    • 面向字节:数据块大小可以不对应

    • 根据网络条件,对每一个字节进行确认

建立可靠连接(三次握手)

  1. 第一次握手

    • 客户端:执行CONNECT原语,生成 SYN = 1 和 ACK = 0 的TCP段,代表连接请求

    • 服务器:执行LISTEN和ACCEPT原语,并进行被动监视

  2. 第二次握手

    服务器检查是否存在监视端口的服务进程

    • 如果没有任何进程,则使用 RST = 1 回答一个TCP段

    • 如果存在进程,则决定拒绝或接受请求

      • 如果接受连接请求,则发送 SYN = 1 和 ACK = 1 的网段
  1. 第三次握手

    客户端发送一个 SYN = 0 和 ACK = 1 的网段确认连接

    • 三次握手是为了避免出现延时之类的情况

    • 默认三次握手就认为可靠了,之后进行数据传输

    • 有时候会选择则第三次握手的时候同时携带数据

停止等待协议

发送段后要暂时保留备份

  • 没有收到确认可以进行重传(超时重传

    • 设置一个超时计数器:如果对方的应答超过一定时间后则直接重发

    • 重新发送时间必须大于 平均传输时间 $\times$ 2

  • 收到确认就抛弃备份

每个网段和ACK必须具有ID

停止等待协议效率较低

没有收到应答或者丢失都要直接重传

收到重复的就直接丢弃并重新发送确认

  • 出现在ACK丢失的情况

连续ARQ协议(滑动窗口的思想)

多个数据同时发送(一次发送多个)

窗口大小是双方协定的

  • 通过TCP报文中的窗口字段表示

出现丢失的情况

  • 如果连续发送五个分组,而第三个分组丢失了,则要不最后三个分组都重传一遍,这叫做后退N帧

释放连接(四次握手)

释放连接前必须等待最大的网络往返时间 2MSL(保证能处理到B最后发送的报文)

  • 防止出现任何无效的连接请求段

  1. 第一次握手

    发起断开连接请求

  2. 第二次握手

    ACK = 1:允许断开,此时不再发送数据,需要完成之前未处理完成的数据的处理

  3. 第三次握手

    FIN = 1:数据处理完成,表示正式断开

  4. 第四次握手

    收到断开信息

TCP中的计时器

  1. 重传计时器:决定多长时间进行重传

  2. 坚持计时器:避免死锁

    • WIN = 0的时候修改但是无法发送过去

    • 收到WIN = 0的时候开始进行计时,到时候主动询问

  3. 保持计时器:发送数据段后刷新,如果到达一定时间则再次询问是不是还要保持连接

  4. 时间等待计时器

TCP有限状态机

  • 粗线:正常的服务器端

  • 细线:异常状态

  • 虚线:正常的客户端

UDP协议

UDP的最主要特点:

  1. 没有建立连接(避免延时)

  2. 简单:发送方、接收方无连接状态

    • 没有握手等

    • 每个UDP段都独立处理

  3. 小段标题

  4. 没有拥塞控制

UDP常见用处:

  1. 流媒体和多媒体应用

    • 速率敏感而非质量敏感
  2. RIP:定期发送路由信息

  3. DNS:避免延迟建立TCP连接(DNS需快速找到

  4. SNMP:拥塞时,SNMP必须仍然可以运行,在没有拥塞和可靠性控制机制的情况下,UDP性能优于TCP

    • 组播和多播
  5. 其他协议如TFTP、DHCP

UDP数据帧格式

UDP详解 - 知乎

  • 首部只有8字节,因此UDP报文最少是8字节

  • 校验时包括数据部分,如果出现错误直接丢弃

  • 应用层进行数据切片,决定如何进行发送,UDP直接发送,不会再自己切片

TCP和UDP的异同

不同点

  1. TCP不是直接交给上层校验,而是需要先和对方沟通,缓存满了才统一交付

  2. UDP直接转发报文,保留报文标间,IP进行划分,应用程序会发送比较何时的UDP报文大小

共同点

  1. 校验相同

NAT和PAT

NAT是再IP数据报头部将一个地址转化为另一个地址的过程

NAT用于允许私下寻址的主机访问Internet,NAT是IP地址耗尽的解决方案之一:

  1. 保留注册(合法)地址

  2. 连接到Internet时增加灵活性

NAT需要一个路由器来实现

  • NAT路由器可以双向转换

NAT(地址转换技术)详解【转载】 - 知乎

NAT的类型

  1. 静态NAT:固定的内部地址到注册地址的映射

  2. 动态NAT:映射以先到先得的方式动态进行

  3. PAT:端口地址转换用于允许许多内部用户共享一个“内部全局”地址

    • 基于socket映射而不是IP地址

    • 多个内网主机映射到一个公网地址

NAT地址类型

  1. 内部本地地址(Inside Local address):内网IP地址

  2. 内部全局地址(Inside Global address):注册IP地址,对外部展示的内部地址

  3. 外部全局地址(Outside Global address):由主机所有者分配的IP地址,通常是注册地址

内部主机发送报文给网关,网关根据NAT table进行翻译,转换成内部全局地址,然后进行转发

NAT的优缺点

  1. 优点:并非每个内部主机都需要同时进行外部访问,因此可以是用少量的全局唯一地址池来服务相对大量的私有寻址主机

  2. 缺点:映射没有从根本上解决地址短缺的问题

PAT

  • 同样的出口IP,用不同的端口号来区别