主要目的并不是学习计算机网络的只是,而是学习作者的思维方式,以及自己对这种思维方式的理解。
这一章首先描述了什么是因特网,以及因特网在我们生活中的应用,让我对因特网很感兴趣,然后就描述了因特网中最简单的例子,两个端之间的数据传输,讲解数据传输的时候从协议到路由器最后到通信卫星,让我脑子里大致有个轮廓,就是两个端传递需要那些设备支持。由两个端的数据传输,自然将到了多端传输,多端传输一个是多端之间连接的复杂性,以及通信过程中的阻塞,丢包和相应解决方案之间的对比。最后由一个我们坐飞机的过程设计到的票务系统,行李托运和飞机等等的分层方案设计引出了本书的核心,也就是大名鼎鼎的OSI参考模型,讲解了面对复杂的传输过程,分层的优缺点以及必要性。
整个第一章读下来,感觉作者由我们的生活出发,引人入胜最终引出本书的知识体系,整个过程看下来真的是收获良多,而且有读下去的欲望,希望知道各层之间是和通信的,又是哪一层与卫星通信的(好牛皮的样子)?然后这么多设备连接的复杂性和传输过程中数据的丢包又是如何处理的,如果我想设计一个不丢包的系统并且要求各层性能最优又该如何做?实际通信过程中的花费和通信效率的取舍又是如何做的?也许读完本书,我并不能得到所有的答案,但是一本书能让你对这些有很大兴趣,那么我认为这本书是成功的。
带着上面的问题,我们希望有一种方式保证我们的数据不丢失,比如像电子邮件以及金融应用,数据丢失可能会造成灾难性的后果。因特网(更一般的是TCP/IP网络)为应用程序提供了两个运输层协议,即UDP和TCP。首先看TCP,TCP服务模型包括面向连接服务和可靠数据传输服务,这意味着当某个应用程序调用TCP作为其运输协议时,该应用程序的数据可靠性传输就得到了保证。UDP是无连接的,因此在两个进程通信前没有握手过程。UDP提供一种不可靠的数据传输服务,也就是说,当进程将一个报文发送进UDP套接字时,UDP协议并不保证该报文讲到达接收进程,不仅如此,到达接收进程的报文也可能是乱序到达的。所以上面的问题已经显而易见了。
HTTP使用TCP作为它的支撑运输协议。HTTP客户端首先发起一个与服务器的TCP连接,一旦连接建立,该客户端和服务器就可以通过套接字接口访问TCP。这里我们可以看到分层体系结构的最大优点,即HTTP协议不用担心数据丢失,也不关注TCP从网络的数据丢失和乱序故障中恢复的细节。那是TCP以及协议栈较底层协议的工作。
在采用HTTP1.1持续连接的情况下,服务器在发送响应后保持该TCP连接打开。在相同的客户与服务器之间,后续的请求和响应报文能够通过相同的连接进行传送。HTTP的默认模式是使用带流水线的持续连接。最近,在HTTP/2是在HTTP1.1基础上构建的,它允许在相同连接中多个请求和回答交错。
SMTP(使用TCP协议)是因特网电子邮件的核心。SMTP一般不使用中间邮件服务器发送邮件,即使这两个邮件服务器位于地球的两端也是这样。假设Alice的邮件服务器在香港,而Bob的服务器在美国,那么这个TCP连接也是从香港到美国之间直接相连,特别是如果Bob的邮件服务器没有开机,该报文会保留在Alice的邮件服务器上并等待进行新的尝试,这意味着邮件并不在中间的某个邮件服务器保留。
你能想象人们之间以这种方法说话吗?如,“您好,我叫132-000-123,请找一下我的同时456-00-345”。这种方式是很难记忆的。
DNS(使用UDP协议)就是域名服务器,它的主要作用是将主机名(如www.baidu.com)转换为IP地址。DNS是由一个分层的DNS服务器实现的分布式数据库,一个使得主机能够查询分布式数据库的应用层协议,使用53端口。
之前的协议都是使用客户-服务器体系结构,极大地依赖与总是打开的基础设施服务器。而P2P协议是从单一服务器向大量主机(称为对等方)分发一个大文件,该文件也许是一个新版的Linux操作系统。在客户-服务器文件分发中,该服务器必须向每个对等方发送该文件的一个副本,因此服务器承受了很大的压力。而在P2P文件分发中,每个对等方能够向任何其他对等方重新分发它已经收到的该文件的任何部分,从而在分发过程中协助该服务器。到2016年为止,最为流行的P2P文件分发协议是BitTorrent,我国的迅雷公司的下载工具就是使用的这种协议,BitTorrent是一个相当复杂的协议。
什么是协议呢,给出一个粗略性的定义:
在两个或多个通信实体之间交换报文的格式和次序,以及对某报文或其他事件传输和/或接收所采取的动作。
在本章我们只知道TCP是一种可靠数据服务,但是它是如何做到这一点的呢?我们不得而知,而下一章我们将会得到答案。
实际上对于大多数应用层开发者来说,学完这一章就差不多了,而学完这一章的直接收益也是最大的,更底层的知识在工作中也许并不会涉及到,如果没有更多的时间可以以后在学,我觉得学习就是应该这样,先解决问题,原理性的知识可以量力而行,无奈,市面上大多数的数据,一直翻到最后才能学到一些核心知识,导致很多人没有耐心读到最后就放弃了,而对于本书中,TCP是如何保证可靠数据服务我是感兴趣的,所以我打算接着读下去。
运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。
端口号是一个16比特的数,其大小在0-65535之间。0-1023范围的端口号称为周知端口号,是受限制的,这是指它们保留给诸如HTTP(80端口)和FTP(21端口)之类的周知应用层协议来使用的。运输层从范围1024-65535内分配一个端口号。
实现这种服务抽象是可靠数据传输协议的责任,由于可靠数据传输协议的下层协议也许是不可靠的,因此这是一项困难的任务,例如,TCP是在不可靠的(IP)端到端网络层之上实现的可靠数据传输协议。
自动重传请求协议(ARQ)
客户首先发送一个特殊的TCP报文段,服务器用另一个特殊的TCP报文段来响应,最后客户再用第三个特殊报文段作为响应。前两个报文段不承载“有效载荷”,也就是不包含应用层数据;而第三个报文段可以承载有效载荷。由于这两台主机之间发送了3个报文段,所以这种连接建立过程通常被称为三次握手
TCP所采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率。如果一个TCP发送方感知从它到目的地的路径上没什么拥塞,则TCP发送方增加其发送速率;如果发送方感知沿着该路径有拥塞,则发送方就降低其发送速率。但是这个方法提出了三个问题。
首先分析一下TCP发送方是如何限制向其接收发送流量的。运行在发送方的TCP拥塞控制机制跟踪一个额外变量,即拥塞窗口(congestion window)。拥塞窗口表示为cwnd,它对一个TCP发送方能向网络中发送流量的速率进行了限制。
我们接下来考虑TCP发送方是如何感知它与目的地之间的路径上出现了拥塞的。我们将一个TCP发送方的“丢包事件”定义为:要么出现超时,要么收到来自接收方的3个冗余ACK。当出现过度的拥塞时,在沿着这条路径上的一台(或多台)路由器的缓存会溢出,引起一个数据报(包含一个TCP报文端)被丢弃。丢弃的数据报接着会引起发送方的丢包事件(要么超时或收到3个冗余ACK),发送方就认为在发送方到接收方的路径上出现了拥塞的指示。
概述了TCP拥塞控制后,现在是我们考虑广受赞誉的TCP拥塞控制算法细节的时候了,该算法包含3个主要部分。
网络层的作用从表面上看极为简单,即将分组从一台发送主机移动到一台接收主机,为此,需要使用两种极为重要的网络层功能。
每个IP地址长度为32比特,因此共有2^32个(或大约40亿个)可能的IP地址。这些地址通常按所谓的点分十进制记法书写,即每个地址中的每个字节用它的十进制形式书写,各字节间以句号隔开。例如,IP地址193.32.216.9。在全球因特网中每台主机和路由器上的每个接口,都必须有一个全球唯一的IP地址(NAT后面的借口除外)。然而,这些地址不能随意地自由选择,一个接口的IP地址的一部分需由其连接的子网来决定。
主机地址也能手动配置,但是这项工作目前更多的是使用**动态主机配置协议(DHCP)**来完成,DHCP允许主机自动获取一个IP地址。网络管理员能够配置DHCP,以使某给定主机每次与网络连接时能得到一个相同的IP地址,或者某主机将被分配一个临时的IP地址,每次连接时该地址也许是不同的。
从移动的性能来说,DHCP确实有很严重的缺陷。因为每当节点连到一个新字网,要从DHCP得到一个新IP地址,当一个移动节点在字网移动时,就不能维持与远程应用之间的TCP连接。在第六章,我们将研究移动IP,它是对IP基础设施的拓展,允许移动节点在网络之间移动时使用其单一的地址。
NAT能使路由器对于外部世界来说甚至不像一台路由器。相反NAT路由器对外界的行为就如同一个具有单一IP地址的单一设备。所有离开家庭路由器流向更大的因特网的报文都拥有同一个源IP地址,且所有进入家庭的报文都有同一个目的IP地址。从本质上讲,NAT能使路由器对外界隐藏了家庭网络的细节。
由于新的子网和IP节点以惊人的增长率连到因特网上,32比特的IP地址空间即将用尽。为了应对这种对大IP地址空间的需求,开发了一种新的IP协议,即IPv6协议。IPv6的设计者还利用这次机会,在IPv4积累的运行经验基础上加进和强化了IPv4的其他方面。(一个经常的问题是:马老师,IPv5出什么事了?人们最初预想ST-2协议将成为IPv5,但ST-2后来被舍弃了。)
IPv6中引入的最重要的变化显示在其数据报格式中:
路由选择算法,其目的是从发送方到接收方的过程中确定一条通过路由器网络的最好的路径。一条好的路径指具有最低开销的路径。
可以用加权有向图来形式化描述路由选择问题。所谓的最低开销路径也就是最短路径。即在源和目的地之间的具有最少链路数量的路径。常用的路由选择的算法有Dijkstra算法和Prim算法,也就是图论里面两种经典的最短路径的算法,所以说数据结构和算法在整个网络的关键节点体现出了无比重要的作用。
为了透彻理解链路层以及它如何和网络层关联的,我们考虑一个交通运输的类比例子。假如一个旅行社计划为游客开辟从美国新泽西州的普林斯顿到瑞士洛桑的旅游路线。假定该旅行社认为对于游客而言最为便利的方案是:从普林斯顿乘坐豪华大轿车到JFK机场,然后乘飞机从JFK机场去日内瓦机场,最后乘火车从日内瓦机场到洛桑火车站。在这个运输类比中,一个游客好比一个数据报,每个运输区段好比一条链路,每种运输方式好比一种链路层协议,而该旅行社好比一个路由选择协议。
因为存在网络层地址(例如,因特网的IP地址)和链路层地址(MAC地址),所以需要在它们之间进行转换。对于因特网而言,这是地址解析协议(Address Resolution Protocol,ARP)。
交换机的任务是接收链路层帧并将它们转发到出链路。
过滤是决定一个帧应该转发到某个接口还是应该将其丢弃的交换机功能。转发是决定一个帧应该被导向那个接口,并把该帧移动到哪些接口的交换机功能。
路由器是使用网络层地址转发分组的存储转发分组交换机。尽管交换机也是一个存储转发分组交换机,但是它和路由器是根本不同的,因为它用MAC地址转发分组。
以上是对书籍计算机网络-自顶向下方法的摘抄,大致的写了一些自己比较感兴趣的点,可以看到整个链路复杂而合理,复杂在每层都有很多的协议和细节需要处理,特别是为了保证数据的可靠传输,几乎每一层都要支持。合理在于分层思想的合理,分而治之是解决复杂问题的常用手段,像我们每个程序员其实也是被分配在某个细分领域,这也是分治思想,当然每个人各司其职整个系统就会很稳定的运行。所以从本书中学到的最重要的两点,一个是分治思想,另一个是学习知识的自顶向下的思想,也就是先从最感兴趣的点或者最容易入手的点进入,然后逐步深入学习。