正在努力加载中...
传输层的小结
  1. 1. 前言
  2. 2. 为什么会出现传输层
  3. 3. 关于端口
    1. 3.1. 端口の分类
  4. 4. 传输层的两种协议
    1. 4.1. UDP
      1. 4.1.1. UDP是无连接的
      2. 4.1.2. UDP尽最大努力交付
      3. 4.1.3. UDP面向报文
      4. 4.1.4. UDP没有拥塞控制
      5. 4.1.5. UDP支持x对y的交互通信
      6. 4.1.6. UDP首部开销小
    2. 4.2. TCP
      1. 4.2.1. TCP是面向连接的
      2. 4.2.2. 每条连接只能有两个端口
      3. 4.2.3. TCP提供可靠交付的服务
        1. 4.2.3.1. 停止等待协议
      4. 4.2.4. TCP提供全双工通信
      5. 4.2.5. 传输是面向字节流的

前言

本文是复习原来的课本《计算机网络(第6版)》而总结出来的梳理思维的小笔记,因为内容也比较多,一次是整理不完了,所以又是慢慢补坑。若有错误欢迎提出(ง •_•)ง。

为什么会出现传输层

我们知道网络层的IP协议可以通过IP地址来帮助我们定位到某一台电脑,但是真的在进行通信的是电脑上的进程,所以我们需要一个东西来区分不同电脑的不同进程,这也是为什么会出现一个传输层。
但是这里就会出现一些问题:

  1. 不同的操作系统的进程标识符格式不同。
  2. 进程的创建和撤销是动态的。
  3. 我们需要的终点入口是功能,而不是实现这个功能的进行是哪一个。

解决的方法:使用协议端口号(简称端口)
虽然通信的终点是应用进程,但我们只要把传送的东西交给端口,剩下的工作就由传输层的协议来完成。

关于端口

端口の分类

  1. 服务器端使用的端口号
    熟知端口号(01023):分派给TCP/IP重要应用程序,如DNS是53,SMTP是25。
    登记端口号(1024
    49151):为没有熟知端口号的应用程序使用的。
  2. 客户端使用的端口号(49152~65535)。又叫短暂端口号,客户进程运行时才进行动态选择。通信结束后,端口号就会不复存在,后面又会分配给新的客户进程使用。

传输层的两种协议

分别是无连接的UDP和面向连接的TCP。

UDP

UDP是无连接的

发送数据之前UDP不需要像TCP一样建立连接,所以减少了开销和时延。

UDP尽最大努力交付

UDP是不保证可靠交付的,也就是传输很快,但是不保证质量。

UDP面向报文

UDP没有拥塞控制

所以即使出现网络拥塞,主机的发送速率也不会降低。对于视频在线直播,网络电话之类的应用来说是很有效的,它们需要实时的传输速率,又可以适当的有数据的损失。

UDP支持x对y的交互通信

这句话的意思是UDP支持下面四种通信:

UDP首部开销小

UDP首部只有8个字节,而TCP首部有20个字节。
UDP首部的结构

  1. 源端口
  2. 目的端口
  3. 长度
  4. 检验和
    这里每个都是占了2个字节。

UDP的伪首部
在UDP的8个字节首部的基础上,其实还有一个12字节的伪首部。
之所以是伪首部,是因为它址在UDP计算检验和的时候临时添加在数据报前的:

TCP

TCP是面向连接的

应用程序在使用TCP协议前,必须要通过三次握手进行建立,要经过四次挥手来结束连接。
来插一个自己画的有机物小剧场,帮助记忆:
图片描述

Q:为什么是三次握手,不是两次握手?
A: 在某种情况下,假如只有两次握手,第一个分组在路上延迟发送了,等到传输结束后,服务器又收到了SYN请求,此时建立连接的话就迟迟得不到客户端的回应。
图片描述

每条连接只能有两个端口

TCP连接的端口叫做套接字(插口),注意很多地方都有这个套接字的概念,但是在这里它的定义是:

端口号+IP地址

每一条TCP连接唯一地被通信两端的两个端点所确定。

TCP提供可靠交付的服务

现实情况下:

  1. 传输信道可能会有差错。
  2. 接收方可能不能及时处理收到的数据。
    所以我们必须要想办法来应付这两种情况,才能实现可靠的服务:

停止等待协议

我们假设只有年糕君在发送数据,有机物在接收数据,并发送确认(但是现实是双方都可以作为发送方和接收方)。

情景一:发送分组丢失
如果一开始年糕君发送的数据块M丢失了,有机物迟迟没有回应,年糕君会通过等待回应的时间来判断块M是不是丢失了,然后就选择重发,这就是超时重传

  1. 年糕君在发送一个分组后,必须要保留发送分组的副本
  2. 分组和确认分组必须进行编号,这样才能明确哪个收到了哪个没收到。
  3. 计时器设置的重传时间应该比数据在分组传输的平均往返时间更长

情景二:确认丢失
如果有机物给年糕君的对数据块M的确认丢失了。年糕君在设定时间内没有收到确认,就会又发送一个M的副本,有机物收到后此时应该:

这样我们就可以实现在不可靠的传输网络上实现可靠通信,这种协议通常称为:自动重传请求ARQ

停止等待协议的缺陷
信道利用率太低。
因为年糕君必须要等到收到有机物的确认才能发送下一个,这其中包括了很多时间,除了包括分组和确认的发送时间,还要加上往返时间(RTT)。但这个过程的核心只是分组发送的时间

解决方法
采用流水线传输,也就是年糕君可以一次性发送多个分组,不必收到确认才发送下一个。

TCP提供全双工通信

所谓全双工通信的定义是:

通信的双方可以同时发送和接收信息的信息交互方式

TCP允许通信双方在任何时候都能发送数据
So,为什么?
因为发送方和接收方都拥有发送缓存和接受缓存,存放双向通信的数据。
所以,应用程序把数据块放进缓存里后,就可以去做自己的事情了。比如在发送的时候,只用丢给缓存,就可以拜拜啦,在接收的时候,有需要再从缓存里去拿行了。
图片描述

传输是面向字节流的

Q:什么是“流”?
A: 流入到进程或从进程流出的字节序列。

虽然程序和TCP的交互是一个个数据块(大小不等),但TCP认为这些都只是一串无结构的字节流。
【虽然我的漫画画的是一个个小块(包裹),但这个小块是可以被拆开,然后把里面的东西(字节)取出来一些或者填进去一些( •̀ ω •́ )】
它不保证发送方的数据块和接收方的数据块是一样的大小,比如你给了它10个块,但是它只用了4个块就把你传来的东西送给它的上级了。
TCP是根据当前的窗口值和拥塞情况来决定一个报文段包含多少字节的。如果TCP缓存数据块太长,就划分短一点再发,如果进行一次只发来一个,就等到足够字数再发送出去。

上一篇 下一篇
ABOUT
欢迎来到小年糕的后花园,年糕的小站开设于2017年,博主年糕君是一个爱好十分广泛的人,也是一个比较佛系的人,不定时爆发脑洞更新(因为是社畜,也可能失踪很久,工作太累了)。 查看更多