计算机网络之传输层

传输层

端到端,进程与进程的通信

  • 使用端口 (Port) 来标记不同的网络进程
  • 端口 (Port) 使用16比特位表示 (0~65535)

image-20210421105559761

UDP协议

  • UDP 用户数据报协议
    • 数据报:应用层传输过来一个完整的数据
    • 对数据报不合并、不拆分
  • UDP是一个非常简单的协议

image-20210421111238096

  • UDP 是无连接协议

  • UDP 不能保证可靠的交付数据

    因为UDP协议头部简单,且无连接想发就发,无法保证数据在网络中是否丢失

  • UDP 是面向报文传输的

    不会对报文做任何处理,而是直接塞进UDP的数据中发送出去

  • UDP没有拥塞控制

    UDP不管网络是否拥塞都会尽量把数据发送出去

  • UDP的首部开销很小

TCP协议

  • TCP 传输控制协议
  • TCP协议是计算机网络中非常复杂的一个协议

image-20210421112430143

  • TCP是面向连接的协议

  • TCP的一个连接有两端(点对点通信)

  • TCP提供可靠的传输服务

  • TCP协议提供全双工的通信

    两个连接都可以发送数据的接收数据

  • TCP是面向字节流的协议

    对应该层的数据进行拆分成一段一段的分别发送然后进行合并

image-20210422163236382

可靠传输

可靠传输的基本原理

停止等待协议

  • 发送方给接收方发送消息1后停止,等待接收方发送确认消息后继续发送消息2

  • 出现差错的情况:通过超时重传来保证可靠传输

    • 发送消息在路上丢失了
    • 确认消息在路上丢失了
    • 确认的消息很久才到
  • 超时定时器:每发送一个消息,都需要设置一个定时器

  • 停止等待协议是最简单的可靠传输协议

  • 停止等待协议对信道的利用率不高

连续ARQ协议

  • ARQ :自动重传请求
  • 批量发送和确认

image-20210421124445875

  • 拥有滑动窗口,批量发送后收到确认再将窗口向前滑动继续发送窗口内的数据

  • 并不需要对每一个报文都确认,而是采用累计确认的方法,比如接收到了5就代表前五个数据已收到,窗口向后滑动五个位置 (大大减少确认报文的数量以提升网络效率)

TCP协议的可靠传输

  • TCP的可靠传输基于连续ARQ协议

  • TCP的滑动窗口是以字节为单位的

  • 如果没有按序收到确认号,过超时时间(超时定时器)就会重传

    • 选择重传:选择重传指定需要重传的字节,是一个边界,是一个字节段 (比如TCP报文中的选项存了1000和1500表示重传1000到1500边界的字节)

    • 每一个字节都有惟一的32位序号,TCP报文的序号也是指一个字节段

流量控制

  • 流量控制指让发送方发送速率不要太快

  • 流量控制是使用滑动窗口来实现的

    窗口指明允许对方发送的数据量

  • 通过窗口大小控制对方发送速率

    • 在向发送方发送确认消息时可以指定窗口的大小(对方可以发送的数据大小),如果指定为0发送方将等待
    • 如果在发送方等待,接收方发送窗口大小的消息时消息丢失,就会出现死锁的情况(发送方和接收方都在等待对方传消息),这时需要坚持定时器
  • 坚持定时器

    • 当接收到窗口消息为0的消息,则启动坚持定时器
    • 坚持定时器每隔一段时间发送一个窗口探测报文

拥塞控制

拥塞

  • 一条数据链路经过非常多的设备
  • 数据链路层中各个部分都有可能成为网络传输的瓶颈
  • 网络对硬件设备的要求大于可用资源导致拥塞

  • 流量控制考虑的是点对点通信量的控制
  • 拥塞控制考虑整个网络,是全局性的考虑

  • 报文超时则认为是拥塞

慢启动算法

  • 由小到大逐渐增加发送数据量(发送数据报文的数量)

  • 每收到一个报文确认,就加一(1 2 4 8 16…)指数增长

  • 当增长到慢启动阈值就不增长了,就会启动拥塞避免算法

拥塞避免算法

  • 维护一个拥塞窗口
  • 只要网络不拥塞 (报文不超时),就试探着拥塞窗口调大 (16 17 18…)

TCP的拥塞控制还是尽可能结合自身考虑,只要网络不拥塞就尽可能发送更多的数据到网络中去,只要拥塞发生了就减少自己所发送的数据量,以降低网络中设备的压力

三次握手

  • TCP标记:存在TCP报文中,占6位,每位各有不同含义
    • ACK :确认位,ACK=1。确认号才生效
    • SYN:同步位,SYN=1,表示连接请求报文
    • FIN:终止位,FIN=1,表示释放连接

image-20210422163606481

seq:序列号

ack:确认号(ack=x+1 表示想要收到x+1的序列号的值)

为什么发送方要发出第三个确认报文(为什么要进行三次握手)?

  • 避免已经失效的连接请求报文传送到对方,引起错误
  • 如果第一次发送后发送方迟迟得不到回应就会发出第二次请求
    • 如果只有两次握手,在重新发的请求确认握手后,后来到的发送请求会再次建立连接,引发错误(如果客户端已经连接超时失败,放弃连接了。这个时候超时的信号又到了服务端,服务第二次握手,认为建立了连接,服务器资源就被浪费了)
    • 三次握手中,第二次到达的报文发出第三次请求后,就会忽略后到的请求

image-20210422164124039

四次挥手

image-20210422165201150

  • 发送方发出请求断开的报文后,接收方回应受到请求,此时发送方以不能发送报文了,但接收方还可以继续发送报文,待接收方信息发送完成后给发送方发送消息表示消息已经发送完成

等待计时器

  • 等待2MSL的时间

    MSL:最长报文段寿命

    MSL建议设置为2分钟

    • 为什么要等待2MSL
      • 最后一个报文是没有确认的
      • 确保发送方的ACK可以到到接收方
      • 2MSL时间内没有收到,则接收方会重发,重复第三次挥手的动作
      • 确保当前连接的所有报文都已经过期
  • 只有在等待计时器结束后才会释放端口

套接字与套接字编程

IP与端口的组合( IP:Port )又称为套接字

  • 套接字(Socket)是抽象概念,表示TCP连接的一端

  • 通过套接字可以进行数据发送或接收

  • 两个套接字既可以确认一条TCP的连接 IP:Port ↔ IP:Port

    TCP连接由两个套接字组成 CS架构

image-20210422171153920