《图解TCP/IP》阅读笔记

《图解TCP/IP》阅读笔记

  • 第一章 网络基础知识
    • 计算机网络发展的7个阶段
      • Batch Processing 批处理
      • TSS(Time Sharing System) 分时系统
      • The Age of network-center 网络中心的时代
      • From easy-connect to safe-connect 从简单连接到安全连接
    • 协议分层与OSI参考模型
    • 传输方式的分类
      • 面向有连接和无连接型
      • 电路交换与分组交换
      • 按照接收端数量分类
        • 单播
        • 广播
        • 多播
        • 任播
    • 地址
      • 地址的唯一性
      • 地址的层次性
    • 网络的构成要素
      • 网卡 network interface card NIC
      • 中继器 Repeater
      • 网桥(第2层交换机)
      • 路由器(第3层交换机)
      • 第4到第7层交换机
        • 功能之1:
        • 功能之2:
      • 网关
    • 现代网络实态
      • 网络的构成
      • 互联网通信
      • 移动网络
      • 从信息发布者的角度看待网络
  • 第二章 TCP/IP基础知识
    • TCP/IP的标准化
    • 互联网基础知识
    • TCP/IP协议分层模型
      • 互联网层(网络层
      • 传输层
      • 应用层(会话层及以上的分层
    • TCP/IP分层模型与通信示例
      • 发送数据包(略
      • 经过数据链路的包
      • 数据包接收处理
  • 第三章 数据链路
    • 以太网
  • 第四章 IP协议
    • IP基础知识
      • IP地址属于网络层地址
      • 路由器控制
      • 发送数据至最终目标地址
      • 数据链路抽象化
      • IP数据面向无连接型
    • IP地址的基础知识
      • IP地址的定义
      • IP地址是由网络和主机两部分标识组成
      • IP地址的分类
        • 注意
      • 广播地址
      • IP多播
        • IP多播与地址
      • 子网掩码
      • 全局地址与私有地址
    • 路由控制
      • IP地址与路由控制
      • 路由表的聚合
      • IP分割和再构成处理
        • IP报文的分片与重组
        • 路径MTU的发现
      • IPV6
        • IPV6中IP地址的标记方法
        • IPv6的特点
        • 全局单播地址
        • 链路本地单播地址
        • 唯一本地地址
      • IPV4 首部
  • 第五章 IP协议相关技术
    • DNS
      • 域名的构成
      • DNS查询
    • ARP
      • 概要
      • ARP工作机制
      • RARP
      • 代理ARP
    • ICMP
      • ICMP概要
      • 主要的ICMP消息
      • ICMPv6
    • DHCP
      • DHCP的工作机制
      • DHCP中继代理
    • NAT
      • NAT-PT
      • 通信质量控制
      • 显式拥塞通知 ECN
  • 第六章 TCP与UDP
    • 传输层的作用
      • 通信处理
      • 两种传输层协议 TCP 和 UDP
    • 端口号
    • TCP
      • 序列号与确认应答:提高可靠性
      • 重发超时如何确定
      • 连接管理
      • TCP以段为单位发送数据
      • 滑动窗口控制:提高速度
      • 重发控制
      • 流控制
      • 拥塞控制
      • 提高网络利用率的规范
    • UDP首部
    • TCP首部
    • 以上就基本是整书看得比较详细的内容了
  • 第八章 应用协议
    • 远程登录
      • Telnet
      • SSH

第一章 网络基础知识

计算机网络发展的7个阶段

Batch Processing 批处理

计算机在一段时间内按照一定的顺序同时处理很多任务成为批处理。

TSS(Time Sharing System) 分时系统

TSS分时系统允许多个用户同时使用一台计算机,使每个用户感觉在使用一台独立的设备,称为独占性。
分时系统有以下属性,独占性,多路性,交互性,及时性。
在分时系统的推动下,开始出现了终端和计算机之间的星形结构,计算机之间的通信进入了一个新时代。

The Age of network-center 网络中心的时代

随着电话网络被IP网络所替代,人们使用IP网络来打电话,看电视,进行计算机之间的通信。

From easy-connect to safe-connect 从简单连接到安全连接

建立通信之后,人们开始考虑日常运维和基本的防御措施,建立起一个安全的链接。

协议分层与OSI参考模型

《图解TCP/IP》阅读笔记_第1张图片

《图解TCP/IP》阅读笔记_第2张图片

分层名称 功能
应用层 针对特定应用的协议,比如 电子邮件协议SMTP、远程登录SSH、文件传输FTP
表示层 设备固有数据格式和网络标准数据格式的转换,固有数据编码格式有 UTF-8,UTF-16等等,表示层和表示层之间为了识别编码格式会附加到首部信息,交给下一层去处理
会话层 通信管理——何时建立连接,断开连接,保持多久的连接,管理传输层以下的分层,比如一次性发送了5封邮件,会话层决定是建立一次连接,全部邮件通过这个连接连续发送给对方;还是同时建立5个连接,同时发送;还是依次建立5次连接,依次发送。会话层会在头部中添加数据传送的顺序
传输层 管理两个节点之间的数据传输,负责可靠传输。真正负责传输具体数据的是传输层及以下。 网络层确立连接与断开连接
网络层 地址管理与路由选择,经过哪个路由器传递到目标地址。根据目的地址,将数据发送到目标计算机
数据链路层 互连设备之间传送和识别数据帧
物理层 界定连接器与网线的规格等等,负责0、1比特流与电压高低/光纤信号的相互转换

其中,传输层位于网络层之上,因为传输层的可靠连接都是基于IP包的交换来建立的,没有IP的交换不可能建立计算机之间的可靠连接。

传输方式的分类

面向有连接和无连接型

其中需要记住的是,面向无连接型,发送端可以在任何时候自由发送数据,由于接收端永远不知道自己何时从哪里收到数据,因此,接收端需要时常确认自己是否收到了数据。

电路交换与分组交换

当前的分组交换的前身就是电话交换,基于电话交换的电话网络历史相对久远。在电话交换中,交换机主要负责数据的中转处理,计算机连接到交换机上面,交换机和交换机之间则由众多通信线路进行连接,建立连接之后,用户就可以通过这一条电路,传输数据,直到该连接被中断为止。
一旦一条电路上连接了多台计算机,其中一台计算机在占用这条电路发送收发数据时,其他计算机就只能等到,直到它结束才有机会使用这条线路。

为了处理这种问题,人们让连接到通信电路的计算机将需要发送的数据切分为多个数据包,按照一定的顺序发送,通信线路就可以被多台计算机同时使用,提高了通信线路的利用率。 在分组的过程中,已经在每个分组的首部中写入了发送端和接收端的地址,所以即使一条线路同时为多个用户提供服务,也可以明确区分每个分组数据发往的目的地。 这就是分组交换。
在分组交换中,由分组交换机(路由器)连接通信线路,路由器收到这些分组数据之后,缓存到自己的缓冲区,因此,分组交换也称为蓄积交换。

按照接收端数量分类

单播

一对一通信,固定电话就是单播的典型例子。

广播

比如电视信号塔将多个电视信号发送给非特定的多个接受对象,电视信号一般都有自己的频段,只有在相应的频段的可接收范围内才能收到电视信号。
类似的,只有在这个网段范围内的计算机才能收到相应的广播消息,这个范围叫做广播域。

多播

多播和广播类似,不同的是,多播需要限定某一组主机作为接受端。最典型的例子是电视会议。

任播

从特定的多台主机中挑选出一台作为接收端,称为任播,通常,被选中的那台主机将返回一个单播信号,

地址

地址的唯一性

多播:一班的同学请起立

任播:一班的哪个同学过来一下

地址的层次性

电话号码:有国家区号和国内区号

通信地址:国名,省名,市名,区名

MAC地址和IP地址都有唯一性,但是它们当中只有IP地址具有地址层次性。

MAC地址是由设备的制造厂商针对每块网卡进行分别指定,人们可以通过制造商识别号,制造商内部产品编号以及产品通用编号确定MAC地址的唯一性,但是人们无法确定哪个厂商的网卡被用在了哪个地方,哪个国家,虽然MAC地址也有一定的层次性,但是对于寻找地址没有任何作用。
所以在实际寻址中,IP地址必不可少。

MAC寻址中参考的这张表叫做地址转发表;
IP寻址中参考的成为路由控制表;

网络的构成要素

设备 作用
网卡 让计算机联网的设备
中继器 从物理层上延长网络的设备
网桥/第2层交换机 从数据链路层上延长网络的设备
路由器/第3层交换机 通过网络层转发分组数据的设备
第4-7层交换机 处理传输层以上各层网络传输的设备
网关 转换协议的设备

备注:这里的第2层指的OSI参考模型中的第二层,也就是数据链路层。

通信媒介与数据链路层
书中总结了不同的数据链路、通信媒介以及标准传输速率,由于不是本次复习的重点,所以略过

传输速率与吞吐量

两个设备之间数据流动的物理速度称为传输速率,单位是bps(Bits Per Second,每秒比特数)。

传输速率不是指数据流动的速度有多快(实际上,在各种传输媒介中信号的流动速度是恒定的),而是说单位时间内传输的数据量有多少。

用生活中的例子来说,低速数据链路就如同车道比较少的无法让很多车同时通过的情况,高速数据链路就相当于多个车道,一次允许更多车辆行驶的道路。

根据上面这种说法,传输速率又称为带宽(bandwidth),带宽越大网络的传输能力越强。
主机之间的实际传输速率被称为吞吐量。也是bps单位,吞吐量还可以衡量CPU处理能力,网络的拥塞程度,报文中数据字段的占有份额(不计算报文首部,只计算数据字段本身)

网卡 network interface card NIC

网络接口卡NIC有时也被称为网络适配器,网卡,LAN卡

中继器 Repeater

中继器是在OSI模型的第一层——物理层面上延长网络的设备,由于电缆传过来的信号由中继器的波形调整和放大之后再传给另外一个电缆。(可以是不同类型的信号之间的转换)
中继器无法改变传输速度。

网桥(第2层交换机)

网桥是在OSI的第二层数据链路层上连接两个网络的设备,它能够识别数据链路层中的数据帧,并且将这些数据帧临时存储于内存,再重新生成信号作为一个全新的帧转发给相连的另外一个网段。
由于网桥这种特性,所以它能连接两个传输速率完全不同的数据链路,并且不限制连接网段的个数。
数据链路层中有一个数据位叫做FCS,网桥通过检查这个域中的值,将那些损坏的数据丢弃,避免发送到其他网段;此外网桥还可以通过地址自学机制和过滤功能控制网络流量。

路由器(第3层交换机)

路由器是在OSI第三层网络层面上连接两个网络,并且对分组报文进行转发的设备。网桥是根据MAC地址进行处理,路由器/3层交换机是根据IP地址进行处理的,因此,TCP/IP中网络层的地址就成了IP地址。

由于路由器分割了数据链路层,因此数据链路层的广播消息将无法继续传播。

第4到第7层交换机

功能之1:

负载均衡
企业级的web站点,使用一台服务器不足以满足前端的访问需求,假设多台服务器来分担,这些服务器前端访问的入口地址通常只有一个,为了让同一个URL能将前台的访问请求分发到后台多个服务器上,可以在这些服务器的前端加一个负载均衡器,这种负载均衡器就是4-7层交换机的一种。

此外还可以通过DNS实现负载均衡,对多个服务器使用同一个域名,每次查这个域名的时候会得到其中一个服务器的地址,从而让不同的客户访问不同的服务器。这种方法也称作循环复用DNS技术

功能之2:

带宽控制
网络比较拥堵的时候,优先处理像语音这种及时性要求比较高的,放缓处理像邮件或数据转发等稍有延迟也并无大碍的通信请求。

除此之外的功能还有广域网加速器,特殊应用访问加速,防火墙(防止互联网上的非法访问)

网关

这里指的网关仅仅针对OSI参考模型中传输层以上各层中进行协议转换的设备或者部件。

网关不仅转发数据还负责对数据进行转换,可以在两个不能进行直接通信的协议之间进行翻译,最终实现两者之间的通信。举个例子,手机邮件和互联网邮件可能互不兼容,这是由于它们在表示层和应用层中的电子邮件协议SMTP互不相同所导致。

手机和互联网之间设置了一道网关之后,网关负责读取各种不同的协议后,对它们进行合理的转换,再将数据转发出去,这样一来即使应用了不同的电子邮件协议,手机和PC之间也能互相发送邮件。

代理服务器也是网关的一种。用来控制网络流量以及保证源服务器的安全。有了代理服务器之后,客户端和服务器无需在网络层上进行通信,而是从传输层到应用层对数据和访问进行各种控制和处理。

防火墙就是一种通过网关通信的产品,能提高系统安全性。

现代网络实态

网络的构成

在现代城市中,分布着高速网络,类似于城市交通中的高速公路,我们称之为“骨干”或者“核心”网络,人们选用高速路由器互相连接使之快速传输大量数据。
相较于骨干网,还有一种叫做,边缘网络,即高速网络的入口。连接边缘网络的部分叫做接入层或者汇聚层。
so that.骨干网络可以专注如何提高业务传输性能和网络的生存性;
具有业务智能化的高速路由器和交换机移到网络的边缘
边缘网络的常用设备多为第2层交换机或者第3层交换机。

互联网通信

个人感觉这张图很形象;对于一些比较大的公司,从外部有大量的访问,这时甚至可以直接连接到边缘网络

移动网络

从信息发布者的角度看待网络

信息发布者专注于内容的撰写,而内容就发布在托管的服务器中,如果是访问量巨大的网站,则需要托管在数据中心中。数据中心可以连接骨干网,小规模的会连接到边缘网络,目的是为了追求更好的处理速度。

在云时代,虚拟化和云技术给现代网站服务提供了更加可靠和高效的服务。


第二章 TCP/IP基础知识

TCP/IP的标准化

大多数时候TCP/IP协议指的是利用IP网络进行通信时必须用到的协议群的统称。有的时候可以认为只是TCP/IP两种协议。
具体来说,TCP/IP泛指以下这些协议,有时也称为网际协议族。

互联网基础知识

互联网是由ARPANET发展而来的、互连全世界的计算机网络。
《图解TCP/IP》阅读笔记_第3张图片

TCP/IP协议分层模型

《图解TCP/IP》阅读笔记_第4张图片
硬件(物理层

网络接口层(数据链路层

有时也将网络接口层与硬件层合并起来称为网络通信层

互联网层(网络层

OSI模型的第三层,IP协议基于IP地址转发分包数据。连接互联网的主机和路由器必须实现IP的功能,其他连接互联网的设备(网桥,中继,集线器)就没有必要一定实现IP或TCP的功能。

IP:IP是跨越网络传送数据包,使得整个网络都能收到数据的协议。IP协议使得数据能够发送到地球上任意一台联网计算机,IP地址作为主机的标识。IP还隐含着数据链路层的功能,通过IP,互相通信的主机之间不论经过怎样的底层数据链路层都能够实现通信。

缺点:虽然IP协议是分组交换的一种协议,但是不具备重发机制,即使分组数据包未能到达主机也不会重发,因此属于非可靠传输协议。

ICMP:IP数据包在发送途中一旦发生异常导致无法到达对端目标地址时,需要给发送端发一个发生异常的通知,ICMP就是为了这一功能指定的。有时候ICMP也被用来诊断网络的健康状况。

ARP: 通过解析网络层地址来寻找数据链路层地址的网络传输协议。

传输层

传输层最主要的功能就是让应用程序之间实现通信。

TCP
TCP是一种面向有连接的传输层协议。TCP可以处理在传输过程中丢包和乱序的问题,还可以有效利用带宽,缓解网络拥堵。

UDP
UDP是一种面向无连接的传输层协议。UDP不会关注对端是否真的收到了传送过去的数据,如果需要检查对端是否收到了分组数据包,或者对端是否连接到网络,需要在应用程序中实现。

应用层(会话层及以上的分层

WWW

浏览器和服务器之间通信所用的协议是HTTP,所传输的数据的主要格式是HTML,HTTP属于OSI应用层的协议,HTML属于表示层的协议。

电子邮件

SMTP协议,一开始人们只能发送文本格式的电子邮件,后来,由MIME协议扩展之后,就可以发送声音、图像等各式各样的信息。这里的MIME协议属于OSI第六层表示层

文本传输FTP

文件传输是指将保存在其他计算机上的文件转移到本地的硬盘上,或者本地硬盘的文件传送到其他机器的硬盘上。
使用FTP进行传输文件的时候,会建立两个TCP连接,一个是发送传输请求所要用到的控制连接与实际传输数据时要用到的数据连接。

远程登录(TELENET SSH)

远程登录常用的两种是TELENET和SSH,此外还有在Xwindowssystem使用的X协议

网络管理(SNMP)

simple network management protocol。使用SNMP的主机、网桥、路由器等称作SNMP代理(agent),而进行管理的称为管理器(manager),而snmp就是manager和agent之间要用到的协议。
在snmp的agent端,保存着网络接口的信息,通信数据量,异常数据量以及设备温度等,这些信息可以通过MIB(management information base)访问。在TCP/IP的网络管理中,SNMP属于应用协议,MIB属于表示层协议。

一个网络范围越大,结构越复杂,就越需要对其进行有效的管理,SNMP可以让管理员及时检查网络拥堵情况,及早发现拥堵,也可以为以后扩大网络收集必要的信息。

SNMP

TCP/IP分层模型与通信示例

《图解TCP/IP》阅读笔记_第5张图片
每一层,都会对所发送的数据附加一个首部,在这个首部中包含了改层必要的信息,比如发送的目标地址以及协议相关信息。
包可以说是全能性术语。
帧用来表示数据链路中包的单位。
数据报是IP和UDP等网络层以上的分层中包的单位。
段表示TCP数据流中的信息。

发送数据包(略

经过数据链路的包

经过每个协议封层时,都必须有识别包发送端和接受端的信息。以太网会用MAC地址,IP会用IP地址,TCP/UDP会用端口作为识别两端主机的地址。


此外,每个分层的包首部中还包含一个识别位,用来识别上一层协议的种类信息。

数据包接收处理

网络接口(以太网驱动)的处理

从包的MAC地址判断是不是发给自己的,是否可以被识别,来决定丢弃数据还是接接收。

IP模块的处理
IP模块收到IP包首部以及后面的数据,做类似的处理,判断IP地址是否和自己的相互匹配,如果上一层是TCP就把IP包首部前面的部分传给TCP处理,如果是UDP进行类似的工作。
接收端地址往往不是自己的地址,此时需要借助路由控制表,调查应该送达的主机或者路由之后进行转发。

TCP模块的处理

计算校验和,判断数据是否被破坏,检查是否按照顺序接受,检查端口,确定具体的应用程序。

应用程序处理

解析数据


第三章 数据链路

这里很多都不是复习的重点,就浏览(摸)了。

以太网

需要注意的是,以下的以太网的帧体格式,其中帧尾的FCS,保存着整个帧除以多项式的余数,在接收端也用同样的方式计算,如果得到相同的FCS,就判定所接收的帧没有差错。FCS具有较强的检错能力,能够检测出大量突发错误。

上行速率:移动端给基站发送消息时的数据传输速率;
下行速率 :基站给移动端发送消息时的数据传输速率。


第四章 IP协议

IP基础知识

IP大致分为三大作用模块,IP寻址、路由(最终节点为止的转发)以及IP分包和组包。

IP地址属于网络层地址

路由器控制

路由控制是指分组数据发送到最终目标地址的功能。一旦这个路由器运行出现异常,分组数据就有可能“迷失”,无法到达目标地址。因此一个数据包之所以能够成功到达最终的目标地址,全靠路由器控制。

发送数据至最终目标地址

Hop称为跳。在一跳的区间内,电缆可以通过网桥或交换集线器相连,不会通过路由器或网关。
多条路由是指路由器或主机在转发IP数据包时,只指定下一个路由器或主机,而不是将到最终目标地址为止的所有通道全都指定出来。因为每一个区间在转发IP数据包时会分别指定吓一跳的操作,直至包达到最终的目标地址。
就比如坐火车的时候,每乘坐一个站之后,都需要在下站的时候询问一下工作人员,然后才知道如何一步步靠近最终目标地址。

路由控制表
为了将数据包转发给主机,所有主机维护着一张路由控制表,该表记录了IP数据在下一步应该发送给哪个路由器,IP包将根据这个路由表在各个数据链路上传输。

数据链路抽象化

IP是实现多个数据链路之间通信的协议。不同的数据链路有一个最大的区别就是,有着各自的最大传输单元MTU。比如以太网中MTU是1500字节,在FDDI中是4352字节,ATM是9180字节。
为了解决这个问题,IP将进行分片处理。这样可以完全忽略数据包在途中的各个数据链路上的MTU,只需要按照源地址发送的长度接受数据包,IP就是以这种方式抽象化了数据链路层,使得上层更加不容易看到底层网络构造的细节。

IP数据面向无连接型

IP为了实现简单与高速化采用面向无连接的方式

小结: 按照网络分层,明确定义每层协议的作用和职责后,针对每层具体的协议进行编程会更加有利于该协议的实现。


IP地址的基础知识

IP地址的定义

IP地址(IPv4)总共是四个字节,一个字节就是8个bit,因此IPv4有 2 32 2^{32} 232这么多个可以用。到了今天IPv4已经全部耗尽。
每一台主机上的每一块网卡NIC都得到了IP地址,通常一个网卡只有一个IP,一台路由器通常会配置两个以上的网卡。
当然并不是说地球上有43亿台电脑可以联网,这其中还有很多是不允许被使用,有着特殊功能的。而且考虑到网络标识和主机标识的设计,又只有少部分是可以被使用的。

IP地址是由网络和主机两部分标识组成

《图解TCP/IP》阅读笔记_第6张图片

这张图很好说明了什么是网络标识,什么是主机标识,反斜杠 / 后面的数字是什么意思。
网络标识:用来标识公网(整个地球)下哪个网段,比如美帝的IP一般就比较短,比如59.23.42.47,59开头的,远远没有达到255,这是因为互联网也是最先在美国诞生的,因此一些前面的IP就先被美帝用了。

主机标识:在同一网段下,主机标识不能相同,因为会冲突

/后面的数字:这个是用来表示从头数多少位属于网络标识,比如 192.168.128.10/24 就表示前面三个点的数字都属于网络标识,是用来区分不同网段的。而后面的8位就是主机标识了。

IP地址的分类

A类:前面1-8位是主机标识,0.0.0.0-127.0.0.0 是A类的网络地址。0位是0,这是一个A类的标识位。

《图解TCP/IP》阅读笔记_第7张图片

B类:B类地址前两位是10。128.0.0.0-191.255.0.0.0

《图解TCP/IP》阅读笔记_第8张图片

C类:C类前三位是110。192.0.0.0-223.255.255.0

《图解TCP/IP》阅读笔记_第9张图片

D类:D类前四位是1110。224.0.0.0-239.255.255.255

在这里插入图片描述

《图解TCP/IP》阅读笔记_第10张图片

注意

分配IP地址的时候,使用比特位表示IP地址的时候,不能全部是0或者全部是1。这两个有特殊用途。

对于全0,表示对应的网络地址或IP不可获知的情况,这时才能使用。

全1通常作为这个网段的广播地址。

所以对于C类地址来说,每个网段最多只能有 256 - 2 = 254个主机地址可以使用。

广播地址

刚才已经说了,比如B类地址 172.20.0.0/16下面的主机,当使用172.20.255.255 的时候,就使用了广播
本地广播

192.168.0.0/24 广播地址是 192.168.0.255/24 ,这个广播地址的IP会被路由器所拦截,不会到达以外的其他链路上。

直接广播

不同网络之间的广播称为直接广播,比如网络地址 192.168.0.0/24的主机向 192.168.1.255/24的目标地址发送IP包,收到这个包的路由器,将数据转发给192.168.1.0/24 ,从而使得 192.168.1.1 - 192.168.1.254 的主机都能收到这个包

IP多播

《图解TCP/IP》阅读笔记_第11张图片

IP多播与地址

多播使用D类地址,D类地址参考之前的介绍。除了前面的1110之外,剩下的28位置可以作为多播的组编号。
从224.0.0.0到 239.255.255.255 都是多播地址的可用范围。其中 224.0.0.0到 224.0.0.255的范围不需要路由控制,在同一个链路内可以实现多播。而在这个范围之外设置多播地址,会给全网所有组内成员发送多播的包。

此外,对于所有的多播,所有的主机(路由器以外的主机和终端机)必须属于 224.0.0.1的组,所有路由器都必须属于 224.0.0.2的组。除此之外,多播中还有很多已知的地址,这里就不展开。

同时要实现IP多播通信,除了地址之外还需要 IGMP协议的支持(Internert Group Management Protocol)

子网掩码

直接使用主机标识和网络标识这种方式是非常浪费的,比如B类地址,允许有6万多台计算机连接,但很多时候一个网段下,不可能有这么多计算机。因此显得比较浪费。

我们使用一个叫子网掩码的东西,通过子网网络地址细分出比ABCD类更小粒度的网络。这种方式实际上就是把ABC等分类中的主机地址部分用作子网地址,可以将原来的网络分为多个物理网络的一种机制。
《图解TCP/IP》阅读笔记_第12张图片
比如 172.20.100.52 的前26位是网络地址,192就是 1100 0000 后面剩下的 6 位都是0,此时该子网掩码就是前面 26位置都是1,后面6位都是0。

也可以写成 172.20.100.52 / 26 ,从上图可以看到不管是IP地址,网络地址还是广播地址,都可以有子网掩码。

CIDR和VLSM

CIDR是采用任意长度分割IP地址的网络标识和主机标识,不必拘泥与ABCD类地址。
VLSM是可以随机修改组织内各个部门的子网掩码长度的机制,使得不同部门可以拥有不同的主机数量。

CIDR和VLSM的出现目的都是为了提高IP地址的利用率

全局地址与私有地址

NAT技术:可以实现私有IP和全局IP的互换。

全局地址需要在全世界保持唯一性,但是私有地址不需要,只需要在同个域中保证唯一即可。
以下这些区域的IP都属于私有网络的IP

10.0.0.0 - 10.255.255.255  (10/8) A类
172.15.0.0 - 172.31.255.255 (172.16/12) B类
192.168.0.0 - 192.168.255.255 (192.168/16)C类

除了上面这些,其他的地址都属于公有IP。

路由控制

路由控制有两种方式,一种是管理员手动设置,称为静态路由控制,另一种是路由器与其他路由器相互交换信息时自动刷新,称为动态控制。

为了让动态路由及时刷新路由表,在网络上互连的路由器之间必须设置好路由协议,保证正常读取路由控制信息。

IP协议始终认为路由表是正确的,IP本身并没有定义制作路由控制表的协议,即IP没有制作路由控制表的机制,该表是由一个叫做“路由协议“的协议制作而成。

IP地址与路由控制

路由控制表中记录着网络地址以及下一步应该发送至路由器的地址,在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到和该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。
有时候有多条吻合的记录,比如目标地址是172.20.100.52 ,路由表中有 172.20/16 以及 172.20.100/24 ,则应该选择匹配度比较高的。

默认路由

0.0.0.0/0 或者default ,这里注意区分,0.0.0.0的IP地址是0.0.0.0/32 ;以及子网掩码是 0.0.0.0。特别注意默认路由的掩码标识是/0

主机路由

IP地址/32 被称为主机路由。 比如192.168.153.15/32 就是一种主机路由。整个IP的所有位都参与路由。使用主机路由将导致路由表膨胀,路由负荷增加,进而造成网络性能下降

环回地址

我们在本机测试前端代码时,用的一个地址 127.0.0.1 就是环回地址,与该地址具有相同意义的是 localhost。使用这个IP或者主机名,数据包都不会流向网络,可以定向到本地正在运行的前端代码。

路由表的聚合

《图解TCP/IP》阅读笔记_第13张图片
路由聚合可以将已知的路由信息传送给周围其他路由器,以达到控制路由信息的目的。比如上图中,路由器C将已知的 192.168.2.0/24 与 192.168.3.0/24 的网络这一信息聚合为 “192.168.2.0/23 的网络已知”,从而进行公示。

IP分割和再构成处理

每种数据链路的最大传输单元MTU都不尽相同,是因为每种数据链路的使用目的都不通。鉴于IP层是数据链路层的上一层,所以它必须不受限于数据链路的MTU大小,也就是说,在协议设计的时候,必须让MTU在IP层看起来是透明的。

IP报文的分片与重组


由于以太网默认的MTU是1500字节,因此对于FDDI中的4532的MTU包来说,进行下一步的传输,无法在一个帧当中完成发送,这时,路由器将IP数据报划分成3个分片进行发送。

这种方式有以下几点不方便的地方:

  1. 进过分片之后的IP数据报在被重组的时候,只能由目标主机进行,路由器虽然会做分片但是不会进行重组。
  2. 现实中无法保证IP数据报是否经由同一个路径传送——所以,途中即使等待片刻,数据包也有可能无法到达目的地,拆分成每个分片也有可能会在途中丢失。
  3. 在某处进行重新组装,但是到了下一站再次经过其他路由器,还会面临着被分片的可能,这会给路由器带来多余的负担,也会降低网络的效率。

处于以上这些原因,在终结点(目标主机)端,重组分片了的IP数据报成为现行的规范。

路径MTU的发现

分片机制有它的不足:

  • 1.路由器的处理负荷加重,随着时代的变迁,计算机网络的物理传输速度不断上升,这些高速的链路,对路由器和计算机网络提出了更高的要求。路由器还需要做网络安全方面的工作,比如网络过滤等,只要允许,就不希望路由器进行IP数据包的分片处理。
  • 2.其次,进行过多的分片处理,一旦某个分片丢失,会造成整个IP数据报作废。

为了应对以上问题,产生了一种 “路径MTU” 发现的技术。所谓路径MTU,就是指从发送端主机到接收端主机之间不需要分片时的最大MTU大小。即路径中存在的所有数据链路中最小的MTU,从发送主机按照路径MTU的大小将数据分片后进行发送,就可以避免在中途的路由器上进行分片处理。现在很多操作系统都具备了路径MTU发现的功能。

《图解TCP/IP》阅读笔记_第14张图片

路径MTU发现的工作原理如下:

  • 首先在发送端主机发送IP数据报时将其首部的分片禁止标志位设置为1,根据这个标志位,途中的路由器即使遇到需要分片才能处理的大包,也不会去分片,而是将包丢弃。随后,通过一个ICMP的不可达消息将数据链路上的MTU的值给发送主机。

  • 下一次,从发送给同一目标主机的IP数据报以获得ICMP所通知的MTU值,以后,将它设置为当前的MTU。发送主机根据这个MTU对数据报进行分片处理。如此反复,直到数据报被发送到目标主机为止,没有再次收到任何ICMP(实际上,上面这个图展示的只是经过一个路由器,有可能下次遇到的路由器的MTU值更加小,那么就会回溯发送一封有关MTU的通知),就认为最后一次ICMP所通知的MTU即是一个合理的MTU值。

IPV6

当然前面有说到IPV6是为了解决IPV4不够用的情况,首先IPV6的书写形式

IPV6中IP地址的标记方法

IP长度是 128 比特, 2 128 ≈ 3.40 ∗ 1 0 38 2^{128} ≈ 3.40*10^{38} 21283.401038 , 这个38位的数量级让它足以给地球上所有的沙子都分配一个IP地址。
由于IP地址比较繁长,因此人们将128比特以每16个比特作为一组,每组用冒号分隔开来,如果连续出现的0还可以进行省略,并且用::隔开,不过一个IP地址只允许出现一次连续的两次冒号,不然就会有歧义。

对于下面这个IPV6的地址(这串太长了,都是盲打的,难免有打错不深究)

111111110110111100:1011101010011000:0111011001010100:0011001000010000:1111111011011100:1011101010011000:0111011001010100:0011001000010000

使用十六进制表示

FEDC:BA98:7654:3210:FEDC:BA98:7564:3210

对于十六进制的这个IP地址

1080:0:0:0:8:800:200C:417A

由于这个IP地址中间有三个0,因此进行省略

1080::8:800:200C:417A

IPv6的特点

  • IP地址的扩大与狱友控制表的聚合
  • 性能提升:包首部长度采用固定的值(40字节),不再使用首部校验码,简化首部结构,减轻路由器负荷。路由器不再进行分片处理(通过路径MTU发现只由发送主机进行分片)
  • 支持即插即用功能:及时没有DHCP服务器也可以实现自动分配IP地址
  • 采用认证与加密功能:应对伪造IP地址的网络安全功能以防止线路窃听的功能(IPsec)
  • 多播、Mobile IP成为拓展功能

DHCP是指,Dynamic Host Configuration Protocol,动态主机配置协议,是一个局域网的网络协议,指的是有服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。

IPsec是 Internet Protocol Security 互联网安全协议,透过对IP协议的分组进行加密和认证来保护IP协议的网络传输协议簇。IPsec 由以下协议组成,1.认证头,为IP数据报提供无连接数据完整性、消息认证以及防重放攻击保护;2.封装安全载荷(ESP),提供机密性,无连接完整性,防重放攻击和有限的传输流机密性;3.安全关联SA,提供算法和数据包,提供AH、ESP操作所需要的参数。

全局单播地址

《图解TCP/IP》阅读笔记_第15张图片

如图所示是,全局单播地址的示意图。

链路本地单播地址

《图解TCP/IP》阅读笔记_第16张图片

链路本地单播地址是指同一个数据链路内唯一的地址,它用于不经过路由器,在同一个链路中的通信。通常接口ID用来保存64比特版的MAC地址

唯一本地地址

顾名思义就是不进行互联网通信时,所使用的地址。
为了提高安全性,企业内部的网络与互联网通信时通常会通过NAT或网关(代理)进行。换句话说,唯一本地地址正式在这种不联网或者不通过NAT以及代理联网的环境下使用的。

《图解TCP/IP》阅读笔记_第17张图片

IPV4 首部

IPV4首部是一个比较重要的内容,不管是在应付考试还是在了解计算机网络的过程中。

版本
这个也就标识一下,是什么内容,其中4表示IP,6表示IPV6,其他的可以不深究(二进制表示)

首部长度
只有四个位,但是单位是4字节。如果值是4,表示16字节长度的首部长度。当没有可选的IP包,就设置为5。因此最长的首部长度可以是 60个字节(1111*4)。

区分服务
这个用来表明服务质量,因为不同的包可能有不同的需求,比如银行交易要求安全,视频通话保证最低延迟等等。

不过由于现实网络状况十分复杂,因此硬性规定这些服务变得没有什么可能性,因此这个字段意义不大。

总长度
这个字段有16个位置,说明可以表示, 2 16 − 1 = 65535 2^{16}-1=65535 2161=65535字节,表示IP首部和数据加起来,最大长度是 65535 字节。

标识
这个标识就是用于分片重组。16比特,同一个分片的标识值相同,不同分片的标识值不同。每次发送一个IP包,这个值就递增。此外,即使这个ID相同,如果目标地址、源地址或协议不同的话,也会被认为是不同的分片。

标志

片偏移 FO: fragment offset
13bit
用来标识被分片每一个分段相对于原始数据的位置,第一个分片对应的值为0。由于FO域占到13位置,因此最多可以表示 2 13 2^{13} 213个相对位置,单位为8个字节,因此 8 ∗ 8192 = 65535 8 * 8192 = 65535 88192=65535字节的位置。

生存时间 Time to Live TTL
8bits
在实际中,这个用来表示可以中转多少个路由器的意思,每经过一个路由器,TTL会减少1,直到变成0则丢弃该包。

协议
8bits
表示的是IP包传输层的上层协议编号,主要有这些协议,ICMP,TCP,IP,UDP,IPv6,ESP,AH等等

首部校验和
16bits
只对数据包的首部进行校验,不对数据部分。主要用来确保IP数据报不被破坏。校验和的计算过程,首先要将校验和的所有位置设置为0,然后以16比特为单位划分IP数据首部,然后全部16比特的数字加起来,最后求一下反码。

源地址
32bits,发送到端IP地址

目标地址
32bits,接收端IP地址

可选项
长度可变,通常只在实验或者进行诊断的时候使用,包含如下几点信息:

  • 安全级别
  • 源路径
  • 路径记录
  • 时间戳
    填充padding
    填充首部长度到32比特的整数倍

数据data
存入数据,将IP上层协议的首部也作为数据进行处理。


第五章 IP协议相关技术

本章主要讲述作为IP的辅助和扩展规范的DNS,ARP,ICMP以及DHCP等协议

DNS

相信有过一定计算机网络基础知识都知道,这是用来将域名和IP地址进行转换的应用,平时用百度的时候,你并不是输入一个IP地址,而是输入了一个域名www.baidu.com,因为域名容易记忆,而IP地址难以记忆。

域名的构成

分层结构,这个也没什么好说的
域名服务器


解析器
进行DNS查询的主机或者软件叫做DNS解析器。用户使用的工作站或个人电脑都属于解析器。

DNS查询

《图解TCP/IP》阅读笔记_第18张图片

如图所示,如果第一次访问其他域或者本域没有查到所求域名的IP地址,就会向上一层域名服务器请求,最终由高层的域名服务器往下遍历,直到获取到正确的域名服务器,然后一步步将查询的结果返回给原来请求的计算机。

DNS有如分布式数据库
这个标题的意思就是,DNS不止可以做到将域名索引为IP地址,还能记录很多信息。
其中,PTR是从IP地址检索主机名称(域名)的信息。
上层或者下层域名服务器IP地址的映射叫做NS记录。(这个肯定要记录,不然就会导致先有鸡还是先有蛋的问题);
以及MX记录,用于记录邮件地址与邮件接收服务器的主机名。

ARP

概要

ARP是一种解决地址问题的协议。以目标IP地址为线索,用来定位下一个应该接收数据分包的网络设备对应的MAC地址。如果目标主机不在同一个链路时,可以通过ARP查找吓一跳路由器的MAC地址。不过ARP只适用于IPV4,不能用于 IPV6,后者可以用ICMPV6代替ARP发送邻居探索消息。

ARP工作机制

工作机制很简单,想要获得对方MAC地址的主机发出询问即可,只不过是在所在链路的广播
《图解TCP/IP》阅读笔记_第19张图片

如果每次发送一个IP数据报都要进行广播即ARP请求,以确定对方的MAC地址,那将会造成不必要的网络流量。因此通常的做法是将获取到的MAC地址进行缓存一段时间。
也就是将 IP对MAC的映射关系记忆记录到一个ARP缓存表中,下一次直接使用缓存表中的MAC地址进行数据报的发送。不止是发送端,由于服务器也要将消息发送给客户端,因此在接收端主机缓存MAC地址也是一种提高效率的方法。


IP地址和MAC地址缺一不可
这个结论是从上图的结构中引出的,如果没有MAC地址,如下图所示,主机A要发数据报给主机B,即使知道了主机B的MAC地址,由于路由器C上并不会记录着B的MAC地址,因此没有办法直达,而IP地址是一种层级的地址,可以通过路由器和各自的网段直接索引到,如果此时A知道对方的IP地址,可以经过路由器C进行转发,到了另外一个链路帧的时候,MAC地址就发挥出作用了(原书并没有讲太清楚,我个人的理解)

RARP

RARP 是将ARP反过来,从MAC地址定位IP地址的一种协议。例如将打印机服务等小型嵌入式设备接入到网络时,就经常会用到。

平常我们可以通过个人电脑设置IP地址,可以通过DHCP自动分配获取IP地址。然而,对于嵌入式设备,则没有任何输入接口或无法通过DHCP动态获取IP地址。在这种情况,就可以使用RARP协议,假设一台RARP服务器,从而在这个服务器上注册设备的MAC地址以及IP地址。然后将这个设备A接入到网络中插电启动,就会发生如图所示的事情。

《图解TCP/IP》阅读笔记_第20张图片

代理ARP

ARP包有时候会被路由器所隔离,但采用代理ARP的路由器可以将ARP请求转发给临近的网段。此时,两个以上网段的节点之间可以像在同一个网段中一样进行通信。

ICMP

ICMP概要

确认网络是否正常工作,遇到异常时进行问题诊断。
ICMP的主要功能包括:

  • 确认IP包是否成功送达目标地址
  • 通知在发送过程中IP包被丢弃的具体原因
  • 改善网络设置
    《图解TCP/IP》阅读笔记_第21张图片
    总的来看,ICMP的消息大致分为两种:通知出错原因的错误消息;用于诊断的查询消息。

下图所示是ICMP消息类型

主要的ICMP消息

ICMP消息不可达
destination unreacheable message:当IP路由器无法将IP数据包发送给目标地址,会给发送端主机返回一个目标不可达的ICMP消息,并在这个消息中显示不可达的具体原因。

如上图所示,其中 fragmentation needed and don’t fragment was set的意思就是ICMP通知前面的主机,发送消息的时候需要进行切片,已经超过当前链路的MTU(最大传输单元) 。

根据如上的错误代码,就可以知道此次发送不可达的具体原因。

ICMP重定向消息

如果路由器发现发送端使用了次优的路径发送数据,那么它会返回一个ICMP重定向的消息给这个主机。在这个消息中包含了最合适的路由信息和源数据。

《图解TCP/IP》阅读笔记_第22张图片

ICMP超时消息

IP包首部中有一TTL字段,每次经过一个路由器就会减少一个,直到减少为0就将IP包丢弃,此时IP路由器将会发送一个ICMP超时的消息(ICMP TIME EXCEEDED MESSAGE) 给发送端主机,并通知该包已经被丢弃。

设置生存周期的目的,是为了在路由控制遇到问题发生循环状况,避免IP包无休止地在网络上被转发。此外,有时可以用TTL控制包的到达范围,例如设置一个较小的TTL值。

  • 在linux中输入 " traceroute DestinationIP " 可以显示由执行程序的主机到达特定主机之前经历多少路由器。
  • 在windows中是 tracert DestinationIP

这个应用的原理就是利用IP包生存周期从1开始按照顺序递增的同时发送UDP包,强制接受 ICMP 超时消息的一种方法。

ICMP回送消息

用户进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息。可以向对端主机发送回送请求的消息(ICMP echo request message,类型8),也可以接受对端主机发回来的会送应答消息(ICMP echo reply message 类型0)。

网络上最常用的ping命令就是利用这个消息实现的。

ICMPv6

IPV4中ICMP仅作为一个辅助作用支持IPV4,也就是说,没有ICMP,IPV4也能实现IP通信。但是在IPV6中,ICMP的作用被扩大,如果没有ICMPv6,ipv6就无法进行正常通信。

IPV6中,IP地址定位从MAC地址的协议从ARP转为ICMP的邻居探索消息。这种邻居消息融合了 IPV4的 ARP、ICMP重定向以及ICMP路由选择消息等功能于一体,甚至还能提供自动设置IP地址的功能。

ICMPV6中,0-127属于错误消息,128-255属于信息消息。

邻居探索

ICMPv6从类型133到类型137的消息叫做邻居探索消息,这种邻居探索消息很重要。邻居请求消息用于IPV6地址与MAC地址的对应关系,并由邻居宣告消息得知MAC地址。邻居请求消息利用IPv6的多播地址实现传输(对比IPv4中使用广播,使得不支持ARP的节点也会收到包,造成一定的资源浪费)

此外,由于IPv6实现了即插即用的功能,所以在没有DHCP服务器的环境下也能实现IP地址的自动获取。如果是一个没有路由器的网络,就可以使用MAC地址作为链路本地单播地址。而在一个有路由器的网络环境中,就可以从路由器获得IPv6前面的部分,后面的就根据MAC地址进行设置。

DHCP

DHCP,动态主机配置协议,dynamic host configuration protocol,有了DHCP,只要连接到网络,就可以进行TCP/IP通信

DHCP的工作机制

使用DHCP之前,需要架设一台DHCP服务器,然后将DHCP所要分配的IP地址设置到服务器上,此外还需要子网掩码,路由控制信息以及DNS服务器的地址等设置到服务器上(有时候路由器充当该网段的DHCP路由器)

《图解TCP/IP》阅读笔记_第23张图片
我相信一开始看到上面这个图疑惑的就是为什么客户端发出了多条发现包请求。这里我注意到书中的一行小字。

在发送DHCP发送包与DHCP请求包时,DHCP是即插即用的,因此IP地址上尉确定。因此,DHCP发送包的目的地址为广播地址 255.255.255.255,而源地址由于未知,所以设置为 0.0.0.0

为了检查所要分配的IP地址以及已经分配了的IP地址是否可用,DHCP服务器或者DHCP客户端必须具备以下功能:

  • DHCP 服务器
    在分配IP地址前发送ICMP回送请求包,确认没有返回应答
  • DHCP客户端
    针对从DHCP那里获得的IP地址,发送ARP请求包,确认没有返回应答。

DHCP中继代理

现实生活中,家庭网,可以就是由路由器充当DHCP服务器,但是学校公司这种大机构就不能这么做,要管理这么多IP将是一个巨大的工程。因此现代比较合理的方式是使用DHCP中继代理,如下图所示,最后DHCP服务器就只需要统一管理每个子网的IP地址的分配范围、子网掩码、默认路由器以及DNS服务器,其他的比如分配具体的IP地址就交给DHCP中继代理来分配。

《图解TCP/IP》阅读笔记_第24张图片

NAT

NAT network address translator 是用于本地网络中使用私有地址,在连接互联网转而使用全局IP地址的技术。除此之外还有转换TCP,UDP端口的NAPT技术。由此可以实现一个全局IP地址与多个主机的通信。

NAT实际上是为了面临地址枯竭的IPv4而开发的技术(实际上已经用完了),不过在IPv6中为了提高网络安全也在使用NAT技术。在IPv4和IPv6之间的相互通信当中尝尝使用NAT-PT。

《图解TCP/IP》阅读笔记_第25张图片


除了上图所展示的,需要注意的是,对于在私有网段的两台主机,私有IP地址和端口可能不同,转换为公有IP的时候,可能用的是同一个IP地址,只不过端口不同而已。

NAT-PT

NAT-PT是将IPv6首部转换成IPv4首部的一种技术,有了这种技术,那些只有IPv6地址的主机就能够和IPv4地址的其他主机进行通信了。

中间有一部分对应付面试或者考试不太重要的内容,我就摸了

通信质量控制

通信质量的定义
通信线路上的拥塞也叫做收敛。当网络发生收敛时,路由器和集线器(交换集线器)的队列溢出,会出现大量的丢包现象。从而影响通信性能。

服务质量QoS(quality of service)

控制通信质量的机制
通信质量包括带宽,延迟,时延波动等内容。路由器在内部的队列中可以优先处理这些要求保证通信质量的包,有时候甚至不得不丢失那些没有优先级的包以保证通行质量。

RSVP技术就是为了保证通信质量:

  • IntServ 点对点的详细优先控制
  • DiffServ 提供相对较粗粒度的优先控制

显式拥塞通知 ECN

作为IP上层协议,TCP虽然也能控制网络拥塞,不过它是通过数据包的实际损坏情况来判断是否发生拥塞。这种办法并不能在数据包损坏之前减少数据包的发送量。

为了解决这个问题,人们在IP层新增了一种使用显示拥塞通知的机制,ECN。

ECN为了 实现拥塞通知的功能,将IP首部的 TOS字段置换为 ECN字段,并且在TCP首部的保留位中追加CWR标志和ECE标志。

但是ECN并不是简单地将包发送给那个发送数据包的源地址主机。——因为这个包能不能发出去还是一个问题,即使发出去,对方是不是支持拥塞控制协议的还未知。

因此,ECN的机制 负责 在发送包的IP首部记录路由器是否遇到拥塞,并在返回的TCP首部中通知是否发生过拥塞。拥塞检查在网络层进行,而拥塞通知在传输层进行。这两层的互相协助实现了拥塞通知的功能。


第六章 TCP与UDP

传输层的作用

IP首部中有一个协议字段,用来识别网络层(IP)的上一层使用的是哪一种传输层协议。(也就是字段TTL之后的一个字段protocol协议字段,可以表示上层使用了TCP还是UDP等等)
同样地为了识别自己所传输的数据部分究竟应该发给哪个应用,TCP, UDP也设定了这样一个编号。

这个编号就是我们熟悉的端口号,其实就是进程号。

通信处理

服务端程序在UNIX系统当中叫做守护进程,例如HTTP的服务端程序是httpd, 而ssh的服务端程序是sshd守护进程。在UNIX中并不需要将这些守护进程逐个启动,而是启动一个可以代表它们接受客户端请求的inetd互联网守护进程 的服务程序即可。它是一种超级守护进程,收到客户端请求之后会复刻(fork)新的进程并且转换(exec)为sshd等各个守护进程。

确定一个请求究竟是发送给哪个服务端守护进程的,可以通过收到的数据包的端口号进行识别,当收到80的请求,转发给httpd;如果端口是22,转发给sshd。

两种传输层协议 TCP 和 UDP

TCP

tcp是面向连接的、可靠的流协议。流 就是不间断的数据结构。TCP为了提供可靠性传输,实行“顺序控制”或者“重发控制”机制。此外还具备“流量控制”、“拥塞控制”、提高网络利用率等众多功能。

UDP

UDP是不可靠的数据报协议。虽然UDP可以保证发送消息的大小,但是不能保证消息一定送达。

DHCP(网络层)基于广播的协议要依赖于 UDP。DNS(网络层)也同样依赖于UDP。

端口号

TCP/UDP 通信中使用5个信息来进行识别一个通信,源IP,源端口,目的IP,目的端口,协议号。只要五个信息中有一项不同,则认为是不同的通信。
端口号如何确定
一般来说知名端口一般由0到1023的数字分配而成。

时序分配法
服务端有必要确定监听端口的口号,但是接受服务的客户端没必要确定端口号,交给操作系统进行分配。操作系统为每个应用程序分配互不冲突的端口号。

TCP

TCP的特点以及目的
TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

序列号与确认应答:提高可靠性

在TCP中,当发送端的数据到达接受主机时,接收端主机会返回一个已收到消息的通知,这个消息叫做确认应答(ACK)。Positive Acknowledgement已经接受。

如果没有收到(或者其他什么error情况)就返回一个NACK Negative Acknowledgement


数据包丢失的情况


确认应答丢失的情况

上面两种情况都可能导致出现主机A进行重发。

有时候在源主机重发数据以后,之前的数据才到达目标主机的情况,屡见不鲜。因此这对于目标主机来说,简直是一种灾难。 它会收到相同的数据,但是为了上层应用提供可靠的传输,必须放弃重复的数据包。

上述这些确认应答处理、重复控制以及重复控制 等功能都可以使用序列号实现。序列号是按照顺序将发送数据的每一个字节(8个bit)都标上编号。接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接受的序号作为确认应答发送出去,这样,通过序列号和确认应答号,TCP可以实现可靠传输。

重发超时如何确定

重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过这个时间仍然没有收到确认应答,发送端将进行数据重发。 那么这个重发超时的具体时间长度又是如何确定的呢?

由于TCP要求无论在任何网络环境下都要提供高性能通信,因此无论网络拥堵情况发生何种变化,都必须保持这一特性。

每次发包时都会计算往返时间(RTT round trip time)以及偏差(方差,也可以称为抖动)。将这个往返时间和偏差相加,重发超时就是比这个总和要稍微大一点的值。

数据重发之后如果还是收不到应答,等待确认时间就会以2倍,4倍的指数函数增长。当然数据不可能无限被重发,达到一定的重发次数之后,如果仍然没有收到任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接,并且通知应用通信异常强行终止。

连接管理

TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。

TCP在发送数据之前,会发送一个SYN包作为建立连接的请求等待确认应答(在TCP中,发送第一个SYN包的一方叫做客户端,接收这个的一方叫做服务端) ,如果对端发来确认应答,则认为可以进行数据通信。否则则不会。
在通信结束时会进行断开连接的处理(FIN包)。

可以使用TCP首部用于控制的字段来管理TCP连接。一个连接的建立与断开至少包括7个包才能完成(3次握手,4次挥手

关于为什么要进行3次握手的面试高频题

tcp连接的双方要确保各自的收发消息的能力都是正常的。

  • 客户端第一次发送握手消息到服务端;
  • 服务端接收到握手消息后把ack和自己的syn一同发送给客户端,这是第二次握手;

当客户端接收到服务端发送来的第二次握手消息后,客户端可以确认“服务端的收发能力OK,客户端的收发能力OK”,但是服务端只能确认“客户端的发送OK,服务端的接收OK”,
所以还需要第三次握手,客户端收到服务端的第二次握手消息后,发起第三次握手消息,服务端收到客户端发送的第三次握手消息后,就能够确定“服务端的发送OK,客户端的接收OK”。

至此,客户端和服务端都能够确认自己和对方的收发能力OK,tcp连接建立完成。

TCP以段为单位发送数据

在建立TCP连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”(MSS: Maximum Segment Size)。最理想的情况就是,从传输层来的包,最大消息长度正好是IP中不会被分片处理的最大数据长度。

对于TCP来说,来自上层协议的数据,是以MSS的大小将数据进行分割发送。进行重发也是以MSS为单位。

而MSS是在三次握手的时候,在两端主机之间计算得出的,两端的主机在发出建立连接的请求时,在TCP首部中写入MSS选项,告诉对方自己的接口能够适应的MSS的大小。然后会在两者之间选择一个较小的值投入使用。

滑动窗口控制:提高速度

TCP以1个段作为单位,每发送一段进行一次确认应答的处理。如果是这样,包的往返时间越长,通信性能越低。
为了解决这个问题,TCP引入 窗口控制 这个概念。即使在往返时间较长的情况下,它也能控制网络性能的下降。—— 发送端主机在发送了一个段以后不必要一直等待确认应答,而是继续发送。


窗口大小就是指无序等待确认应答可以继续发送数据的最大值。如上图所示,窗口大小为4个段。

这个机制实现了使用大量的缓冲区 buffer,通过对多个段同时进行确认应答的功能。

如果其中部分数据出现丢包,那么发送端仍然要负责重传,为此,发送端主机得设置缓存保留这些待被重传的数据,直到收到它们的确认应答。


在收到某个包的确认应答之后,可以将窗口滑动到下一个位置,这样可以顺序地将多个段同时发送提高通信性能。这种机制称为 ”滑动窗口控制“

重发控制

在使用窗口控制中,如果出现段丢失应该怎么办?


在窗口比较大,又出现报文段丢失的情况下,同一个序号的确认应答将会不断地返回。如果发送端主机连续3次收到同一个确认应答,就中断当前的窗口发送,马上发送主机B需要的那个数据段。

流控制

窗口控制是从发送方的角度来决定发送速度,而流控制是从接收方的角度来决定发送的数据量的大小

接收端可能接收到一个和前后毫无关系的数据包,可能在处理包的顺序上花费一些时间,甚至在高负荷的情况下无法接受任何数据。如此一来,如果接收端将本应该接受的数据丢弃,就会触发重发机制,从而导致网络流量的浪费。

为了防止这种现象,TCP提供一种流控制,让发送端根据接收端的实际接收能力控制发送的数据量。

在TCP的首部中,有一个专门的字段用来通知窗口大小,接受主机可以将自己可以接受的缓冲区大小放入这个字段,通知发送端。这个字段越大,吞吐量越大。

一旦这个缓冲区面临数据溢出,窗口大小的值,随之设置为了一个更小的值,通知发送端,从而控制数据发送量。


从3001号开始数据段缓冲区满了,不得不暂停。发送端主机会时不时发送一个窗口探测,此数据段,仅包含一个字节以获取最新的窗口大小。

拥塞控制

书里面拥塞控制讲得有点含糊,这篇讲得不错,由于需要外网访问,所以我进行一定的搬运。

https://sites.google.com/site/jishutaolun/network/tcp-congestion


引述开始:

为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成,后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”、“快速恢复(Fast Recovery)”算法,再后来在TCP NewReno中又对“快速恢复”算法进行了改进,近些年又出现了选择性应答( selective acknowledgement,SACK)算法,还有其他方面的大大小小的改进,成为网络研究的一个热点。

TCP的拥塞控制主要原理依赖于一个拥塞窗口(cwnd)来控制,在之前我们还讨论过TCP还有一个对端通告的接收窗口(rwnd)用于流量控制。窗口值的大小就代表能够发送出去的但还没有收到ACK的最大数据报文段,显然窗口越大那么数据发送的速度也就越快,但是也有越可能使得网络出现拥塞,如果窗口值为1,那么就简化为一个停等协议,每发送一个数据,都要等到对方的确认才能发送第二个数据包,显然数据传输效率低下。TCP的拥塞控制算法就是要在这两者之间权衡,选取最好的cwnd值,从而使得网络吞吐量最大化且不产生拥塞。

由于需要考虑拥塞控制和流量控制两个方面的内容,因此TCP的真正的发送窗口=min(rwnd, cwnd)。但是rwnd是由对端确定的,网络环境对其没有影响,所以在考虑拥塞的时候我们一般不考虑rwnd的值,我们暂时只讨论如何确定cwnd值的大小。关于cwnd的单位,在TCP中是以字节来做单位的,我们假设TCP每次传输都是按照MSS大小来发送数据的,因此你可以认为cwnd按照数据包个数来做单位也可以理解,所以有时我们说cwnd增加1也就是相当于字节数增加1个MSS大小。

慢启动:最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。具体来说,当新建连接时,cwnd初始化为1个最大报文段(MSS)大小,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认,cwnd就增加1个MSS大小。这样cwnd的值就随着网络往返时间(Round Trip Time,RTT)呈指数级增长,事实上,慢启动的速度一点也不慢,只是它的起点比较低一点而已。我们可以简单计算下:

   开始           --->     cwnd = 1
   经过1个RTT后   --->     cwnd = 2*1 = 2
   经过2个RTT后   --->     cwnd = 2*2= 4
   经过3个RTT后   --->     cwnd = 4*2 = 8

如果带宽为W,那么经过RTT*log2W时间就可以占满带宽。

拥塞避免:从慢启动可以看到,cwnd可以很快的增长上来,从而最大程度利用网络带宽资源,但是cwnd不能一直这样无限增长下去,一定需要某个限制。TCP使用了一个叫慢启动门限(ssthresh)的变量,当cwnd超过该值后,慢启动过程结束,进入拥塞避免阶段。对于大多数TCP实现来说,ssthresh的值是65536(同样以字节计算)。拥塞避免的主要思想是加法增大,也就是cwnd的值不再指数级往上升,开始加法增加。此时当窗口中所有的报文段都被确认时,cwnd的大小加1,cwnd的值就随着RTT开始线性增加,这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。

  • 上面讨论的两个机制都是没有检测到拥塞的情况下的行为,那么当发现拥塞了cwnd又该怎样去调整呢?

首先来看TCP是如何确定网络进入了拥塞状态的,TCP认为 网络拥塞 的主要依据是它重传了一个报文段。上面提到过,TCP对每一个报文段都有一个定时器,称为重传定时器(RTO),当RTO超时且还没有得到数据确认,那么TCP就会对该报文段进行重传,当发生超时时,那么出现拥塞的可能性就很大,某个报文段可能在网络中某处丢失,并且后续的报文段也没有了消息,在这种情况下,TCP反应比较“强烈”:

  • 1.把ssthresh降低为cwnd值的一半
  • 2.把cwnd重新设置为1
  • 3.重新进入慢启动过程。

从整体上来讲,TCP拥塞控制窗口变化的原则是AIMD原则,即加法增大、乘法减小。可以看出TCP的该原则可以较好地保证流之间的公平性,因为一旦出现丢包,那么立即减半退避,可以给其他新建的流留有足够的空间,从而保证整个的公平性。

其实TCP还有一种情况会进行重传:那就是收到3个相同的ACK 。TCP在收到乱序到达包时就会立即发送ACK,TCP利用3个相同的ACK来判定数据包的丢失,此时进行快速重传,快速重传做的事情有:

  • 1.把ssthresh设置为cwnd的一半
  • 2.把cwnd再设置为ssthresh的值(具体实现有些为ssthresh+3)
  • 3.重新进入拥塞避免阶段。

引述结束


看到上面两个过程,分别是遇到网络拥塞,和收到三个相同的ACK,分别对应下图中 “超时” 和 “重复确认应答” 两个点(注意不是两个颜色位置)

至于 紫色部分,也就是虚线(慢启动阈值)和 ssthresh点相差了一部分(具体来说是 ssthresh 高于 慢启动阈值),实际上就是博客里面写的多了三个,原因就在于,


后来的“快速恢复”算法是在上述的“快速重传”算法后添加的,当收到3个重复ACK时,TCP最后进入的不是拥塞避免阶段,而是快速恢复阶段。快速重传和快速恢复算法一般同时使用。快速恢复的思想是“数据包守恒”原则,即同一个时刻在网络中的数据包数量是恒定的,只有当“老”数据包离开了网络后,才能向网络中发送一个“新”的数据包,如果发送方收到一个重复的ACK,那么根据TCP的ACK机制就表明有一个数据包离开了网络,于是cwnd加1。如果能够严格按照该原则那么网络中很少会发生拥塞,事实上拥塞控制的目的也就在修正违反该原则的地方。

具体来说快速恢复的主要步骤是:

  • 1.当收到3个重复ACK时,把ssthresh设置为cwnd的一半,把cwnd设置为ssthresh的值加3,然后重传丢失的报文段,加3的原因是因为收到3个重复的ACK,表明有3个“老”的数据包离开了网络。
  • 2.再收到重复的ACK时,拥塞窗口增加1。
  • 3.当收到新的数据包的ACK时,把cwnd设置为第一步中的ssthresh的值。原因是因为该ACK确认了新的数据,说明从重复ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态。

除此之外博客还将了其他的细节,不搬太多了。

提高网络利用率的规范

Nagle 算法
TCP为了提高网络的利用率,经常是用欧冠一个叫做Naggle的算法。
指发送端即使还有应该发送的数据,如果这部分数据很少的话,则进行延迟发送的一种处理机制。

如果以下两个条件都不满足,那么暂时等待一段时间以后再进行数据发送:

  • 已发送数据都已经收到确认应答
  • 可以发送最大段长度(MSS)的数据时

延迟确认应答
接受数据的主机如果每次都立刻回复应答,可能会返回一个比较小的窗口,那是因为刚接收完数据,缓冲区已满。

所以收到数据不马上进行返回确认应答,延迟一些时间。

  • 在没有收到 2*最大段长度 的数据 为止不做应答确认(有的操作系统受到两个就应答)
  • 其他情况下,延迟 0.5秒再发送

甚至,不必为每个数据段都进行一次确认应答,在滑动窗口中,文件传输可以两个数据段应答一次。

捎带应答
意思就是等接受主机有回执要发给 发送主机 的时候,捎带上 ACK就可以了。

UDP首部


没什么好说的,就几个字段,不过有关checksum的计算,这里和IP的checksum的计算有点区别,除了上图这个部分之外,还需要再附带一个东西,就是下图的,伪首部

需要从IP包里面拿两个IP地址,然后构造这个伪首部,贴在UDP的前面,然后,和IP的计算checksum规则类似,填0,求和,之后求补码。填入即可。

关于为什么要添加上伪首部?
我想主要是为了保证 TCP/IP通信的正常的五大要素 的正确性,也就是
源IP地址,目的IP地址,源端口,目的端口,协议号(UDP是17)

TCP首部

数据偏移
该字段表示TCP所传输的数据部分应该从TCP包的哪一个位开始计算,当然也可以把它看做是TCP首部的长度。
控制位
这部分就是用来表明是什么用处的,比如SYN,FIN,ACK。
窗口大小
就是用来通知从确认号开始可以接受的数据大小。如果是0,这是个窗口探测(不过数据必须是1个字节)。
校验和
在这里我们要重点提及了,上次在UDP中我们只讲了怎么去填充这个校验和
(TCP同样要构造检验和,只不过协议号是6),有部分内容是在IP包的checksum的计算中提及到了,接下来要提到怎么用这个校验和,建议这三部分联系起来看

由于校验和字段保存着本字段以外的的补码的值,因此如果计算包括校验和在内的所有数据的16位和以后,得出的结果是 “16位全为1” ,说明收到的数据是正确的。

  • 要特别注意的是,我也在IP的校验和计算中有提及,这里的补码是 1 的补码,其实是反码的意思。所以一个数的反码和自身相加,自然就等于 全1。

选项
option这里有一个比较有意思的选项,也就是类型 5 的SACK:


SACK就是改变TCP的确认机制,最初的TCP只确认当前已连续收到的数据,SACK则把乱序等信息会全部告诉对方,从而减少数据发送方重传的盲目性。比如说序号1,2,3,5,7的数据收到了,那么普通的ACK只会确认序列号4,而SACK会把当前的5,7已经收到的信息在SACK选项里面告知对端,从而提高性能,当使用SACK的时候,NewReno算法可以不使用,因为SACK本身携带的信息就可以使得发送方有足够的信息来知道需要重传哪些包,而不需要重传哪些包。

以上就基本是整书看得比较详细的内容了



第八章 应用协议

从这里开始,就是一些比较简单的东西了,我打算快速过掉,以至于我都忽略了偏向于硬件层面的 第七章路由协议:

远程登录

Telnet

命令

telenet IP TCP_port
  • 21: ftp
  • 25: SMTP
  • 80: HTTP
  • 110: POP3

因此,下面这两个命令是同一个作用

ftp IP
telnet IP 21

SSH

SSH是加密的远程登录系统,TELENT无需输入密码就可以发送。容易造成通信窃听和非法入侵的危险。

SSH有以下功能:

  • 更强的认证机制
  • 转发文件
  • 端口转发功能

SSH最强大的功能是端口转发,收到的消息转发到特定的IP 地址和端口号码。 内容被加密,确保了信息安全。如下图所示:


补充内容:
由于这部分写得有点摸,因此就不上目录

#### 文件传输
**FTP**
#### 电子邮件
**SMTP**
**MIME**
可以发送多媒体
**POP**

cookie
web应用为了获取用户信息使用的叫cookie的机制。浏览器使用cookie在客户端保存信息(用户名,登录名,登录状态)。这样就可以重复请求登录验证用户个人帐号密码。

SNMP
网络管理

第九章 网络安全

你可能感兴趣的:(笔记,计算机网络,图解TCP/IP)