网络基础知识学习

发布时间 2024-01-11 15:19:42作者: konglingbin
1、网络基础知识

   ·OSI 七层模型

   TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。TCP/IP 不是一个协议,而是一个协议族的统称,里面包括了 IP 协议、ICMP 协议、TCP 协议、以及 http、ftp、pop3 协议等。网络中的计算机都采用这套协议族进行互联。TCP/IP 被分为 4 层,应用层、传输层、网络层、网络接口层。
    ·应用层:应用程序通过这一层访问网络,常见 FTP、HTTP、DNS 和 TELNET 协议;
    ·传输层:TCP 协议和 UDP 协议;
    ·网络层:IP 协议,ARP、RARP 协议,ICMP 协议等;
    ·网络接口层:是 TCP/IP 协议的基层,负责数据帧的发送和接收。

    

   2、IP地址

   网络上每一个节点都必须有一个独立的 IP 地址,通常使用的 IP 地址是一个 32bit 的数字,被分成 4 组,例如,255.255.250.250 就是一个 IP 地址。
   终端输入 ipconfig命令查看自己的 IP 地址

   也可以输入其他的命令查看电脑的其他配置,这里就不一一列举了。

ipconfig /all 显示详细信息
ipconfig /renew 更新所有适配器
ipconfig /renew EL* 更新所有名称以 EL 开头的连接
ipconfig /release *Con* 释放所有匹配的连接
ipconfig /allcompartments 显示有关所有隔离舱的信息
ipconfig /allcompartments /all 显示有关所有隔离舱的详细信息

  3、域名
   常见的域名包括 com、net 和 org 三种顶级域名后缀,除此之外每个国家还有自己国家专属的域名后缀(比如我国的域名后缀为 cn)。目前经常使用的域名诸如百度(www.baidu.com)、Linux 组织(www.lwn.net)等等。
   可以使用命令nslookup 或者 ping来查看与域名相对应的 IP 地址,我们可以使用ping github.com (如果 github 也 ping 不通,那么可以使用 ping baidu.com)

ping github.com DOS命令
nslookup baidu.com linux命令
  4、MAC 地址

   MAC(Media Access Control)地址,或称为物理地址、硬件地址,用来定义互联网中设备的位置。在 TCP/IP 层次模型中,网络层管理 IP 地址,链路层则负责 MAC 地址。因此每个网络位置会有一个专属于它的 IP 地址,而每个主机会有一个专属于它 MAC 地址。
  5、端口号
   服务器的默认程序一般都是通过人们所熟知的端口号来识别的。例如,对于每个 TCP/IP 实现来说,SMTP(简单邮件传输协议)服务器的 TCP 端口号都是 25,FTP(文件传输协议)服务器的 TCP 端口号都是 21,TFTP(简单文件传输协议)服务器的 UDP 端口号都是 69。任何 TCP/IP 实现所提供的服务都用众所周知的 1-1023 之间的端口号。这些人们所熟知的端口号由 Internet 端口号分配机构(Internet Assigned Numbers Authority,IANA)来管理。
   常用协议对应端口号:
     SSH 22;FTP 20 和 21;Telnet 23;SMTP 25;TFTP 69;HTTP 80;SNMP 161;Ping 使用 ICMP,无具体端口号
  6、封装和分用
   封装:当应用程序发送数据的时候,数据在协议层次当中自顶向下通过每一层,每一层都会对数据增加一些首部或尾部信息,这样的信息称之为协议数据单元(Protocol Data Unit,缩写为 PDU),在分层协议系统里,在指定的协议层上传送的数据单元,包含了该层的协议控制信息和用户信息。如下图所示:

      ·物理层(一层)PDU 指数据位(Bit)
      ·数据链路层(二层)PDU 指数据帧(Frame)
      ·网络层(三层)PDU 指数据包(Packet)
      ·传输层(四层)PDU 指数据段(Segment)
      ·第五层以上为数据(data)
   分用:当主机收到一个数据帧时,数据就从协议层底向上升,通过每一层时,检查并去掉对应层次的报文首部或尾部,与封装过程正好相反。

在网络中,不同的层有不同的标识:

  • 数据链路层的标识是MAC地址
  • 网络层的标识是IP地址
  • 传输层的标识就是UDP或者TCP的端口号

MAC地址

MAC地址也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。

MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址

MAC地址由网络设备制造商生产时烧录在网卡的EPROM(一种闪存芯片,通常可以通过程序擦写)

  • Mac地址是由一个48位(6字节)的二进制,为了方便记忆,常转为12个16进制数,如:00-16-EA-AE-3C-40就是一个MAC地址,其中前3个字节,16进制数00-16-EA代表网络硬件制造商的编号,而后3个字节,16进制数AE-3C-40代表该制造商所制造的某个网络产品(如网卡)的系列号。只要不更改自己的MAC地址,MAC地址在世界是唯一的。形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性

工作过程

网络上的数据包从初始点开始 ,经过一个个中间节点最终到达目标节点 ,数据包是如何从初始节点开始识别一个个中间节点最终找到目标节点的呢?

  • 实际上初始节点是根据目标节点的地址 ,将目标节点的IP地址映射到中间节点的MAC地址,找到第一个中间节点。从第一个中间节点出发,根据目标节点的IP地址映射到第二个中间节点的MAC地址,从而找到第二个中间节点……,以此类推,直到当找到最后一个中间节点后,从最后一个中间节点出发,根据目标节点的地址映射到目的节点的MAC地址,从而将数据包传送给目标主机。
  • 所以数据包的传送过程就是:不断地将目标节点的地址映射到一个个中间节点的MAC地址,再从一个个中间节点出发,直到找到最终的目标节点

数据包传送的关键是将目标节点的IP地址映射到中间节点的MAC地址。IP地址与MAC地址的映射要通过ARP地址解析协议来完成。

MAC头

生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上 MAC 头部

MAC 包头格式

MAC头是以太网使用的头部,它包含了接收方和发送发的MAC地址等信息
在这里插入图片描述
在MAC包头里需要发送发MAC地址和接收方MAC地址,用于两点之间的传输

怎么生成报文

协议类型

一般在TCP/IP通信里面,MAC包头的协议类型只使用

  • 0800: IP协议
  • 0806: ARP协议

怎么填写发送方的MAC地址

发送方也就是自己的MAC地址。直接从本机的网卡中的ROM中读取出来就可以,MAC地址是在网卡生产时写入到ROM中的。

怎么填写接收方的MAC地址

  • 先查询路由表,得到下一步要发送的IP:在路由表中找到相匹配的条目,然后把包发给Gateway列中的** IP 地址**就可以了。
  • 现在我们已经知道了要发送的IP地址,那么怎么知道这个IP地址是那块**网卡(Mac地址)**呢?
    1. ARP 协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个 IP 地址是谁的?请把你的MAC 地址告诉我”。
    2. 然后就会有人回答:“这个 IP 地址是我的,我的 MAC 地址是 XXXX”。
      在这里插入图片描述
      如果对方和自己处于同一个子网中,那么通过上面的操作就可以得到对方的 MAC 地址。然后,我们将这个 MAC 地址写入 MAC 头部,MAC 头部就完成了。

好像每次都要广播获取,这不是很麻烦吗?

在后续操作系统会把本次查询结果放到一块叫做ARP缓存的内存空间留着以后用,不过缓存的时间就几分钟。

也就是说,在发包时:

  • 先查询 ARP 缓存,如果其中已经保存了对方的 MAC 地址,就不需要发送 ARP 查询,直接使用ARP 缓存中的地址。
  • 而当 ARP 缓存中不存在对方 MAC 地址时,则发送 ARP 广播查询。

查看 ARP 缓存内容

在这里插入图片描述

arp获取mac地址只能获取内网机器的mac地址

ARP工作原理解析:

主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;

主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;

当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:

  • 第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。
  • 第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
  • 第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
  • 第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
  • 第5步:主机A收到主机B发来的ARP回复消息时,用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。

有几个网卡就有几个MAC地址,有几个MAC地址就有几个IP地址

为什么有了MAC地址还要有IP地址

    • 网卡坏了怎么办?
    • 如果一个IP主机要从另一个地方移动到其他地方,要重新装机吗?
    • IP地址的分配是根据网络的拓扑结构,而不是谁制造了网络设备。

IP的基本认识

IP在TCP/IP参考模型中处于第三层,也就是网络层

网络层的主要作用是:实现主机和主机之间的通信,也叫做点对点通信

问:网络层与运输层的关系

网络层(IP)提供点到点的服务,运输层(TCP/UDP)提供端到端的服务

问:网络层和数据链路层的关系

有的小伙伴分不清 IP(网络层) 和 MAC (数据链路层)之间的区别和关系。

其实很容易区分,在上面我们知道 IP 的作用是主机之间通信用的,而 MAC 的作用则是实现「直连」的两个设备之间通信,而 IP 则负责在「没有直连」的两个网络之间进行通信传输

举个生活的栗子,小林要去一个很远的地方旅行,制定了一个行程表,其间需先后乘坐飞机、地铁、公交车才能抵达目的地,为此小林需要买飞机票,地铁票等。

飞机票和地铁票都是去往特定的地点的,每张票只能够在某一限定区间内移动,此处的「区间内」就如同通信网络中数据链路。

在区间内移动相当于数据链路层,充当区间内两个节点传输的功能,区间内的出发点好比源 MAC 地址,目标地点好比目的 MAC 地址。

整个旅游行程表就相当于网络层,充当远程定位的功能,行程的开始好比源 IP,行程的终点好比目的IP 地址。

在这里插入图片描述
如果小林只有行程表而没有车票,就无法搭乘交通工具到达目的地。相反,如果除了车票而没有行程表,恐怕也很难到达目的地。

因为小林不知道该坐什么车,也不知道该在哪里换乘。因此,只有两者兼备,既有某个区间的车票又有整个旅行的行程表,才能保证到达目的地。与此类似,计算机网络中也需要「数据链路层」和「网络层」这个分层才能实现向最终目标地址的通信。

还有重要一点,旅行途中我们虽然不断变化了交通工具,但是旅行行程的起始地址和目的地址始终都没变。其实,在网络中数据包传输中也是如此,源IP地址和目标IP地址在传输过程中是不会变化的,只有源 MAC 地址和目标 MAC 一直在变化。

具体参考: 数据链路层VS网络层

IP基础

在TCP/IP网络通信时,为了保证能够正常通信,每个设备都需要配置正确的IP地址。否则无法实现正常的通信

  • 互联网上的每个接口必须有一个唯一的Internet地址(也叫做IP地址)
  • 多接口主机具有多个IP地址,其中每个接口都对应一个IP地址。
  • 由于互联网上的每个接口必须有一个唯一的IP地址,因此必须要有一个管理机构为接入互联网的网络分配IP地址。这个管理机构就是互联网网络信息中心,称作InterNIC(Internet Network Information Center)。InterNIC只分配网络号。主机号的分配由系统管理员来负责。
  • 有三类I P地址:单播地址(目的为单个主机)、广播地址(目的端为给定网络上的所有主机)以及多播地址(目的端为同一组内的所有主机)。

IP地址(ipv4)由32位二进制数来表示。

  • 因此IP地址的最大值是2 3 2 = 4294967296 2^32=4294967296232=4294967296,即最大允许 43 亿台计算机连接到网络。

  • 实际上,IP 地址并不是根据主机台数来配置的,而是以网卡。像服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。

  • 因此,让 43 亿台计算机全部连网其实是不可能的。

  • IP 地址是由「网络标识」和「主机标识」这两个部分组成的,所以实际能够连接到网络的计算机个数更是少了很多

  • 「网络标识」唯一标记一个局域网

  • 「主机标识」唯一标记局域网中的一台主机

  • 现在的网络设备早就超过了43 亿了,为了解决IP不足的问题,提出了NAT技术。 后来,又有了ipv6

为了方便记忆,我们采用了点分十进制的标记方式处理IP地址:将32位的IP地址以每8位为组,共分为 4
组,每组以「.」隔开,再将每组转换成十进制
在这里插入图片描述

IP地址的分类[了解即可,目前已经不用]

我们知道 IP 地址是由「网络标识」和「主机标识」这两个部分组成的,又根据「网络标识」和「主机标识」的位数,我们可以将IP地址大致分为:A类,B类、C类。实际上,IP地址一共分为5类:A类,B类、C类、D类、E类
在这里插入图片描述

问:怎么判断是哪类IP地址

在这里插入图片描述

问:A、B、C 分类地址最大主机个数是如何计算的呢?

最大主机个数,就是要看主机号的位数,如 C 类地址的主机号占 8 位,那么 C 类地址的最大主机个数:
在这里插入图片描述
为什么要减 2 呢?
因为在 IP 地址中,有两个 IP 是特殊的,分别是主机号全为 1 和 全为 0 地址

  • 主机号全为 1 指定某个网络下的所有主机,用于广播
  • 主机号全为 0 为本地地址,表示本地网络或主机;

在分配过程中,应该去掉这两种情况。
在这里插入图片描述
从而,可以算出各类IP地址的最大主机数量

对于A,B,C类(A、B、C三类是给互联网用户使用的)
在这里插入图片描述

因为D类和E类地址是没有主机号的,所以不可用于主机IP, D类用来组播(就是多播)的,E类只是试用的。
在这里插入图片描述

广播地址用于什么?多播地址用于什么?

由于IP分类存在很多缺点

  • 同一网络下没有地址层次,比如一个公司里用了 B 类地址,但是可能需要根据生产环境、测试环境、开发环境来划分地址层次,而这种 IP 分类是没有地址层次划分的功能,所以这就缺少地址的灵活性。
  • A、B、C 类有个尴尬处境,就是不能很好的与现实网络匹配。
    • C 类地址能包含的最大主机数量实在太少了,只有 254 个,估计一个网吧都不够用。
    • 而 B 类地址能包含的最大主机数量又太多了,6 万多台机器放在一个网络下面,一般的企业基本达不到这个规模,闲着的地址就是浪费。

所以现在上面的分类方法已经不用了,为此我们引入了CIDR。

无类型域间选路CIDR

  • CIDR打破了原来设计原来设备的几类地址的做法,将32位的IP地址一分为二,前面是网络号,后面是主机号。
  • 从哪里分呢? 比如10.100.122.2/24,这个IP地址中有一个斜杠,斜杠后面有个数字24。这种地址就是CIDR。后面24的意义是,32位中,前24位是网络号,后8位是主机号

CIDR可以用来判断是不是本地人

IP地址 VS 域名系统 VS 端口号

  • 在一个互联网上,每个接口都使用IP地址来标识,尽管用户习惯使用主机名而不是 I P地址。
  • 域名系统为主机名和 I P地址之间提供动态的映射。
  • 端口号用来标识互相通信的应用程序。服务器使用知名端口号,而客户使用临时设定的端口号。

Linux下如何查看IP地址

两个命令:ifconfig、ip addr。

看个例子:

$ ip addr

这个命令显示了这台机器上所有的网卡。大部分网卡都有一个IP地址,当然,这不是必须的。
  • 192.168.0.28就是网卡ens33的IP地址值
  • IP之后的scope
    • 对于ens33这张网卡来讲,是global,表示这张网卡是可以对外的,可以接收来自各个地方的包
    • 对于lo来讲,是host,表示这张网卡仅供本机相互通信
      • lo全程是loopback,又称为环回接口,往往会被分配到127.0.0.1这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现
  • 在IP地址的上一行是link/ether 00:0c:29:db:1a:7e brd ff:ff:ff:ff:ff:ff,这个被称为MAC地址,是一个网卡的物理地址,用16进制,6个byte表示。
    • MAC地址是一个很容易让人误解的地址。因为MAC地址号称全局唯一,不会有两个网卡有相同的MAC地址,而且网卡自生产出来,就带着这个地址。很多人就会想,既然这样,整个互联网的通信,全部用MAC地址就好了,只要知道了对方的MAC地址,就可以把信息传过去
    • 这样当然是不行的,一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。而有门牌号码属性的IP地址,才是有远程定位功能的。
    • 也就是说,IP地址相当于门牌号码,MAC地址相当于身份证。你问路的时候可以问【xxx路xxx号】怎么走,但是你不能问【身份证号码为xxx】的人在哪里
    • MAC地址像是身份证,是一个唯一的标识。它的唯一性设计时为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识
    • MAC地址是由一定定位功能的,只不过范围非常有限。你可以根据IP地址,找到杭州市xxx路xxx层ccc号,但是依然找不到人,这时候你就可以吼,身份证号xxx的是哪位?对方听到了,就会回应,是我。当然,如果你在上海叫,身份证号xxx的是哪位,是绝对找不到的
    • 也就是说,MAC地址的通信范围比较小,局限在一个子网里面。比如,从192.168.0.2/24访问192.168.0.3/24是可以用MAC地址的。一旦跨子网,比如从192.168.0.2/24访问192.168.1.3/24就只能用IP地址定位了
    • 现在很多工具都有可以更改本机的MAC地址,也就是网络上存在很多MAC地址被更改成一样,为什么没有出现通讯异常或者混乱? MAC地址是一个局域网冲突才会影响网络通信,局域网外是IP定位,所以不同局域网的网络设备MAC一样是不会有通讯问题的
  • 关于<BROADCAST,MULTICAST,UP,LOWER_UP>,这个叫做net_device_flags,网络设备的状态标识
    • UP表示网卡处于启动的状态
    • BROADCAST表示这个网卡有广播地址,可以发送广播包
    • MULTICAST表示网卡可以发送多播包
    • LOWER_UP表示L1是启动的,也即是网线插着呢
  • mtu 1500:最大传输单元MTU为1500,这是以太网的默认值
    • 网络包是层层封装的、MTU是二层MAC层的概念。
    • MAC层有MAC的头,以太网规定连MAC头带正文合起来,不允许超过1500个字节。正文里面有IP的头、TCP的头、HTTP的头。如果放不下,就需要分片来传输
  • `qdisc pfifo_fast``
    • qdisc ,queueing discipline,即排队规则。内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据加入队列
    • 最简单的qdiscpfifo,它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列
    • pfifo_fast稍微复杂一点。它的队列包括三个波段(band)。在每个波段里面,使用先入先出规则
      • 三个波段(band)的优先级页不相同。band 0 优先级最高、band 2的最低。如果biand 0里面有数据包,系统就不会处理band 1 里面的数据包,bind 1 和 bind 2 之间也是一样
      • 数据包是按照服务类型(Type of Service,TOS)被分配到三个波段(band)里面的。TOS是IP头里面的一个字段,代表了当前的包是高优先级的,还是低优先级的

在 TCP/IP 套件中使用广泛的两个传输层协议如下。

  • 用户数据报协议(UDP)是数据报 socket 所使用的协议。
  • 传输控制协议(TCP)是流 socket 所使用的协议。

端口号

传输层协议的任务是向位于不同主机(或者同一主机)上的应用程序提供端对端的通信服务。为完成这个任务,传输层需要采用一种方法来区分一个主机上的应用程序。在TCP和UDP中,这种区分工作是通过一个16位的端口号来完成的

TCP/UDP是用端口号来识别应用程序。那么这些端口号是如何选择的呢?

  • 服务器一般都是通过知名端口号来识别的。
    • 比如:
      • 对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是2 3
      • 每个TFTP (简单文件传送协)服务器的U D P端口号都是6 9。
      • ssh daemon 使用众所周知的端口 22
      • HTTP(Web 服务器和浏览器之间通信时所采用的协议)使用众所周知的端口 80。
    • 任何TCP/IP实现所提供的服务都用知名的1-1023之间的端口号。这些知名端口号由Internet 号分配机构(中央授权机构互联网号码分配局(IANA))管理
      • 一个众所周知的端口号的分配是由一个被核准的网络规范(通常以 RFC 的形式)来规定的。
      • IANA还记录着注册端口,将这些端口分配给应用程序开发人员的过程就不那么严格了(这也意味着一个实现无需保证这些端口是否真正用于它们注册时所申请的用途)
      • 范围0-1024间的端口也是特权端口,这意味着只有特权(CAP_NET_BIND_SERVICE)进程可以绑定到这些端口上(有些时候,特权端口也被称为保留端口。)
    • 注册端口范围为 1024~41951。
  • 客户端通常会它所使用的的端口号并不关心,只需要保证该端口号在本机上唯一即可。客户端端口号又叫做临时端口号(即存在时间很短)。
    • IANA 将位于 49152 到 65535 之间的端口称为动态或私有端口,这表示这些端口可供本地应用程序使用或作为临时端口分配。
    • 然后不同的实现可能会在不同的范围内分配临时端口。在 Linux 上,这个范围是由包含在件/proc/sys/net/ipv4/ip_local_port_range 中的两个数字来定义的(可通过修改这两个数字来修改范围)。
    • 大多数TCP/IP实现给临时端口分配1024-5000之间的端口号。大于5000的端口号是为其他服务器预留的(Internet 上并不常用的服务器)
    • Solaris 2.2是一个很有名的例外。通常TCP和UDP的缺省临时端口号从32768开始。
  • 标准的简单服务
    • 有一些标准的简单服务几乎每种实现都要提供。如下图,可以看到当使用TCP和UDP提供相同的服务时,一般选择相同的端口号

       


      从上图可以看出,

用户数据报协议(UDP)

UDP仅仅在IP之上添加了两个特性:端口号和一个进行检测传输数据错误的数据检验和

与IP一样,UDP也是无连接的。由于它并没有在IP之上添加可靠性,因此UDP是不可靠的。如果一个基于UDP的应用程序需要确保可靠性,那么这项功能就必须在应用程序中予以实现。

选择一个UDP数据报的大小以避免IP分段:

应该尽可能的避免IP分段。TCP提供了避免IP分段的机制,但是UDP没有提供相应的机制。使用UDP时如果传输的数据报的大小超过了本地数据连接的MTU,那么很容易就会导致IP分段

基于UDP的应用程序通常不会知道源主机和目的主机之间的路径的MTU。一般来讲,基于UDP的应用程序会采用保守的方法来避免IP分段,即确保传输的IP数据报大小小于IPv4的组织缓冲区的最小值576字节。在这 576
字节中,有 8 个字节是用于存放 UDP 头的,另外最少需要使用 20 个字节来存放 IP 头,剩下的 548 字节用于存放 UDP 数据报本身。在实践中,很多基于 UDP 的应用程序会选择使用一个更小的值 512 字节来存放数据报

传输控制协议(TCP)

TCP在两个端点(即应用程序)之间提供了可靠的、面向连接的、双向字节流通信信道。如下图所示:

 

建立连接

在开始通信之前,TCP必须在两个端点之间建立一个通信信道。在连接建立期间,发送端和接收端需要交换选项来协商通信的参数

将数据打包成段

数据会被分解成段,每一个段都包含一个校验和,从而能够检测出端到端的传输错误。每一个段使用单个IP数据报来传输

确认、重传、超时

当一个TCP段无错的到达目的地时,接收TCP会向发送者发送一个确认,通知它数据发送成功了。如果TCP到达时出错了,那么这个段就会被丢弃,也不会发送确认。为了处理段永远不到达或者被丢弃的情况,发送者在发送每一段时会开启一个定时器,如果在定时器超时之前没有收到确认,那么就会重传这个段。

  • 由于所使用的网络以及当前的流量负载会影响一个段和接收其确认所需的时间,因此TCP采用了一个算法来动态的调整重传超时时间的大小
  • 接收 TCP 可能不会立即发送确认,而是会等待几毫秒来观察一下是否可以将确认塞进接收者返回给发送者的响应中。(每个 TCP 段都包含一个确认字段,这样就能将确认塞进TCP 段中了。)这项被称为延迟 ACK 的技术的目的是能少发送一个 TCP 段,从而降低网络中包的数量以及降低发送和接收主机的负载。

排序

在TCP连接上传输的每一个字节都会分配到一个逻辑序号。这个数字指出了该字节在这个连接的数据流中所处的位置。当传输一个TCP分段时会在其中一个字段中包含这个段的第一个字节的序号。

在每一个段上加上一个序号的作用:

  • 这个序号使TCP分段能够以正确的顺序在目的地进行组装,然后以字节流的形式传递给应用层(些分段的到达顺序可能与被发送的顺序可能是不同的)
  • 由接受者返回给发送者的确认消息可以使用序号来标识出收到了哪个TCP分段
  • 接受者可以使用序号来移除重复的分段。

一个流的初始序号(ISN)不是从0开始的,而是由一个算法生成的,该算法会递增分配给后继TCP连接的ISN

流量控制

流量控制防止一个快速的发送者将一个慢速的接收者压垮。

要实现流量控制,接收TCP就必须要为进入的数据维护一个缓冲区(每个 TCP 在连接建立阶段会通告其缓冲区的大小)。当从发送TCP端收到数据时会将数据累积在这个缓冲区中,当应用程序读取数据时会从缓冲区中删除数据。在每个确认中,接受者会通知发送者其进入数据缓冲区的可用空间。TCP流量控制算法采用了滑动窗口算法,它允许包含总共N字节(提供的窗口大小)的未确认段同时在发送者和接收者之间传输。如果接收TCP的进入数据缓冲区被填满了,那么窗口就会关闭,发送TCP就会停止传输数据。

接收者可以使用 SO_RCVBUF socket 选项来覆盖进入数据缓冲区的默认大小(参见socket(7)手册)。

拥塞控制:慢启动和拥塞避免算法

TCP的拥塞控制算法被设计用来防止快速的发送者压垮整个网络。如果一个发送TCP发送包的速度要快于一个中间路由器转发的速度,那么该路由器就会开始丢弃包。这将会导致较高的包丢失率。TCP拥塞控制算法在下面两个场景中是比较重要的:

  • 在连接建立之后:此时(或者当传输一个已经空闲了一段时间的连接上恢复时),发送者可以立即向网络中诸如尽可能多的分段,只要接受者公告的窗口大小运行即可(事实上,这就是早期的 TCP 实现的做法)。这里的问题在于如果网络无法处理这种分段洪泛,那么发送者就会立即压垮整个网络
  • 当拥塞被检测到时:如果发送 TCP 检测到发生了拥塞,那么它就必须要降低其传输速率。TCP 是根据分段丢失来检测是否发生了拥塞,因为传输错误率是非常低的,即如果一个包丢失了,那么就认为发生了拥塞

TCP的拥塞控制策略组合采用了两种算法:慢启动和拥塞避免

  • 慢启动算法会使发送 TCP 在一开始的时候以低速传输分段,但同时允许它以指数级的速度提高其速率,只要这些分段都得到接收 TCP 的确认。慢启动能够防止一个快速的 TCP 发送者压垮整个网络。但如果不加限制的话,慢启动在传输速率上的指数级增长意味着发送者在短时间内就会压垮整个网络。TCP 的拥塞避免算法用来防止这种情况的发生,它为速率的增长安排了一个管理实体
  • 有了拥塞避免之后,在连接刚建立时,发送 TCP 会使用一个较小的拥塞窗口,它会限制所能传输的未确认的数据数量。当发送者从对等 TCP 处接收到确认时,拥塞窗口在一开始时会呈现指数级增长。但一旦拥塞窗口增长到一个被认为是接近网络传输容量的阈值时,其增长速度就会变成线性,而不是指数级的。(对网络容量的估算是根据检测到拥塞时的传输速率来计算得出的或者在一开始建立连接时设定为一个固定值。)在任何时刻,发送 TCP 传输的数据数量还会受到接收 TCP 的通告窗口和本地的 TCP 发送缓冲器的大小的限制。

慢启动和拥塞避免算法组合起来使得发送者可以快速地将传输速度提升至网络的可用容量,并且不会超出该容量。这些算法的作用是允许数据传输快速地到达一个平衡状态,即发送者传输包的速率与它从接收者处接收确认的速率一致