基础知识
什么是计算机网络?
计算机网络是通信技术与计算机技术紧密结合的产物,也就是计算机网络=通信技术+计算机技术。
自治-无主从关系
互连-互联互通

什么是Internet?
全球最大的互联网络 —— ISP (Internet Service Provider) 网络互连的“网络之网络”。它由以下几部分组成
- 数以百万计的互连的计算设备集合:
- 主机(hosts)=端系统 (end systems)
- 运行各种网络应用
- 通信链路
- 光纤, 铜缆, 无线电, 卫星……
- 分组交换: 转发分组 (数据包)
- 路由器(routers) 和 交换机(switches)

网络协议
仅有硬件(主机、 链路、路由器……)连接,Internet能否顺畅运行?能保证应用数据有序交付吗?
还需要网络协议。
协议是计算机网络的所有通信过程都必须遵守某种/些规则。规定了通信实体之间所交换的消息的 格式、意义、顺序以及针对收到信息或发生的事件所采取的“动作”(actions)
协议的三要素
语法(Syntax)
- 数据与控制信息的结构或格式
- 信号电平
语义(Semantics)
需要发出何种控制信息
完成何种动作以及做出何种响应
差错控制
时序(Timing)
- 事件顺序
- 速度匹配
网络结构
计算机网络结构分为 3 部分
- 网络边缘:
- 主机 (各种服务器,pc机,手机….)
- 网络应用 (Web, email…)
- 接入网络,物理介质:
- 有线或无线通信链路
- 网络核心(核心网络):
- 互联的路由器(或分组转发设备)
- 网络之网络
网络边缘
客户/服务器(client/server)应用模型
客户发送请求,接收服务器响应,如:Web应用,文件传输FTP应用
对等(peer-peer, )应用模型:
P2P(点对点),通信在对等实体之间直接进行,可以不用依赖专用服务器,比如qq
网络核心
网络核心的关键功能:路由+转发

数据交换
如何实现数据通过 网络核心从源主机到达 目的主机?
数据交换
数据交换的类型
电路交换
报文交换
分组交换
电路交换
最典型电路交换网络:电话网络
电路交换的三个阶段:
- 建立连接(呼叫/电路建立)
- 通信
- 释放连接(拆除电路)
电路交换的缺点就是:独占资源

报文交换(message switching)
报文:源(应用)发送信息整体 , 比如:一个文件

分组交换(package switching)
分组:报文分拆出来的一系列相对较小的数据包 ,分组交换需要报文的拆分与重组 ,产生额外开销
1. 3种常见的计算机体系结构划分
OSI分层(7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、网际层、运输层、应用层。
五层协议(5层):物理层、数据链路层、网络层、运输层、应用层。
每一层的作用如下:
- 物理层:激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。该层为上层协议提供了一个传输数据的物理媒体。物理层的任务就是透明地传送比特流。
- 数据链路层:数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。
- 网络层:网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能。
- 传输层:构的最高层,直接为用户的应用进程提供服务。
运输层的任务是负责向两个主机中进程之间的通信提供服务。由于一个主机可同时运行多个进程,因此运输层具有复用和分用的功能。复用是指多个应用层进程可同时使用运输层的服务,分用是指运输层把收到的信息分别交付给应用层中的相应进程。
- 应用层:为操作系统或网络应用程序提供访问网络服务的接口。
2. 常见的网络协议
网络层
- IP协议:网际协议
- ICMP协议:Internet控制报文协议
- ARP协议:地址解析协议
- RARP协议:逆地址解析协议
传输层
- UDP协议:用户数据报协议
- TCP协议:传输控制协议
应用层
- FTP:文件传送协议
- Telenet:远程登录协议
- DNS:域名解析协议
- POP3:邮局协议
- HTTP协议
- SMTP:简单邮件传送协议
- SNMP:简单网络管理协议
- TFTP:简单文件传送协议
网际协议IP
IP 协议的特点
- 不可靠:并不保证 IP 数据报能成功地到达目的地。如果发生某种错误,如某个路由器暂时用完了缓冲区,IP 有一个简单的错误处理算法:丢弃该数据报,然后发送 ICMP 消息报给信源端。任何可靠性必须由上层提供(如TCP)。
- 无连接:IP 并不维护任何关于后续数据报的状态消息,每个连接都是独立的。这也说明,IP数据报可以不按发送顺序接收。
IP首部
普通的 IP 首部长 20 个字节(不包含选项字段),包含协议版本号、首部长度、总长度、唯一标识、TTL、首部检验和、源 IP 地址和目的 IP 地址。
- 通过首部长度和总长度字段就可以知道IP数据报中数据内容的起始位置和长度。
- TTL生存时间字段设置了数据报可以经过的最多路由器数。初始值由源主机设置,一旦经过一个处理它的路由器,其值就减一;当该字段的值为0时,数据报就被丢弃。
- 首部检验和字段是根据 IP 首部计算的检验和码(ICMP、UDP、TCP检验和同时覆盖了首部和数据部分)。
- 如果长度超过了MTU,则要进行分片…..
IP 地址
IP 地址一般有网络号和主机号组成(D 类和 E 类无此分法)。网络号标志主机(或路由器)所连接到的网络,主机号则标志该网络下的主机或路由器。
上图中的A类、B类、C类地址都是单播地址(一对一通信),是最常用的。网络号字段的最前面有1-4位的类别位。其中有两个特殊的IP地址,主机号全为0的IP地址代表网络地址,主机号全为 1 的 IP 地址为广播地址。当向某个网络的广播地址发送消息时,该网络内的所有主机都能收到该广播消息。
A类地址:以0开头,第一个字节范围:0127;191;
B类地址:以10开头,第一个字节范围:128
C类地址:以110开头,第一个字节范围:192223;239;
D类地址:以1110开头,第一个字节范围为224
3 个特殊的 IP 地址
255.255.255.255
该IP地址指的是受限的广播地址 。
0.0.0.0
常用于寻找自己的 IP 地址,例如在我们的 RARP,BOOTP 和 DHCP 协议中,若某个未知 IP 地址的无盘机想要知道自己的 IP 地址,它就以 255.255.255.255 为目的地址,向本地范围(具体而言是被各个路由器屏蔽的范围内)的服务器发送IP请求分组。
127.0.0.1
127.0.0.0/8 被用作回环地址,回环地址表示本机的地址,常用于对本机的测试,用的最多的是127.0.0.1。
划分子网
划分子网的方法是从主机号借用若干个位作为子网号 subnet-id,而主机号host-id 也就相应减少了若干个位。于是两级 IP 地址在本单位内部就变为三级IP地址:网络号、子网号和主机号。
IP 地址 ::= {<网络号>, <子网号>, <主机号>}
子网对外部路由器来说隐藏了内部网络组织的细节,在外部看来,不同子网的主机仍属于同一个网络。
凡是从其他网络发送给本单位某个主机的IP数据报,仍然是根据IP数据报的目的网络号net-id,先找到连接在本单位网络上的路由器。然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网。最后就将 IP 数据报直接交付目的主机。
如何正确地区分子网号和主机号是一个问题,这可以通过 子网掩码 来确定。将 网络号和子网号全设为1 的 IP地址 为子网掩码。给定IP地址和子网掩码以后,主机就可以确定IP数据报的目的地是本子网的主机,本网络中其他子网的主机,还是其他网络的主机。
ARP 协议与 RARP 协议
ICMP 地址掩码请求,用于无盘系统在引导过程中获取自己自己的子网掩码。该 ICMP 报文的类型字段为17或18,代码字段为0,并返回32位子网掩码。
ICMP( Internet 控制报文协议 )
ICMP 是 IP 层的一个组成部分,它传递差错报文以及其他需要注意的信息。ICMP 报文是在 IP数据报内部(IP 首部 + ICMP 报文)被传输的。ICMP报文由类型字段、代码字段、检验和和其他字节组成,前两个字段决定了ICMP 报文的类型。
ICMP 地址掩码请求,用于无盘系统在引导过程中获取自己自己的子网掩码。该ICMP报文的类型字段为17或18,代码字段为0,并返回32位子网掩码。
ICMP 端口不可达差错,如果收到一份 UDP 数据报而目的端口与某个正在使用的进程不相符,那么 UDP 返回一个 ICMP 不可达报文。ICMP 报文必须包括生成差错报文的数据报 IP 首部,还必须至少包括跟在该 IP 首部后面的前 8 个字节。
ping程序
ping 程序的目的是为了测试另一台主机是否可达。该程序发送一份 ICMP 回显请求报文给主机,并等待返回 ICMP 回显应答。它只利用 ICMP 回显请求和回显应答报文,而不经过传输层。
ping 127.0.0.1 环回地址时,如果不能ping通,说明当前机器的TCP/IP 协议栈有问题,127本身是一个虚接口,任何时候都是直接上交到内核中处理的。
ping 192.168.1.X 本机的以太网地址,则是测试本机的网络适配器(就是网卡啦),一般是以太网驱动程序。
ping这两个地址时你会发现,使用wireshark抓包时,是没有ICMP的回显请求发出的,这说明这两个ping程序是不会发送到网络中的(只在局域网中)。
ping 同一网段中的网络地址,不通则说明网络线路出现了故障,如果网络中还存在路由器,则应该先ping路由器在本网络的地址,不通则是本机和路由器之间的线路有问题。通了,则再ping路由器所在目标计算机网络所在网段的端口IP地址,不通则说明了路由器出现了故障,通了就再ping目标主机的IP地址。
如果 ping www.baidu.com 等网络地址ping不通时,则说明本机的DNS服务器设置错误。
TCP协议
TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。TCP通过以下方式来提供可靠性:
应用数据被分割成TCP认为最适合发送的数据块。
超时重传。当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到确认,将重发这个报文段。
当TCP收到发自TCP连接另一端的数据后,他将发送一个确认。该确认通常将推迟几分之一秒。
TCP将保持他首部和数据的检验和。
由于IP数据报的到达可能会失序,因此TCP报文段的到达也可能失序。如有必要,TCP将对收到的数据进行重新排序,并以正确的顺序交付给应用层。
既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
流量控制。防止较快主机致使较慢主机的缓冲区溢出。
TCP的首部
TCP虽然是面向字节流的,但TCP传送的数据单元却是报文段。一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中各字段的作用。因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。TCP报文首部固定部分各字段的意义如下
源端口和目的端口
各占两字节,分别写入源端口号和目的端口号。TCP的分用也是通过端口实现的。
报文段序号
占4字节。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置,首部中的序号字段值则是指本报文所发送的数据的第一个字节的序号。
确认号
期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则表明到序号N-1为止的所有数据都已正确收到。
数据偏移
指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,实际上指出了TCP报文段的首部长度。
6个控制位
确认ACK:TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
复位RST:当RST=1时,表明TCP连接中出现严重错误,必须释放连接,然后再重新建立运输连接。
同步SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使用SYN=1和ACK=1.
终止FIN:用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
窗口
窗口字段明确指出了现在允许对方发送的数据量,该值经常在动态变化着。例如,设确认号是701,窗口字段是1000。这就表明从701算起,发送此报文段的一方还有接收1000个字节数据的接收缓存空间。
TCP连接的建立与终止过程

三次握手
第一次握手:客户端发送 syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
四次挥手
与建立连接的“三次挥手”类似,断开一个TCP连接则需要“四次握手”。
第一次挥手:主动关闭方发送一个 FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在 fin 包之前发送出去的数据,如果没有收到对应的 ack 确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。(与SYN相同,一个FIN占用一个序号)。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
使用UDP和TCP的场景
UDP的典型应用:实时性,不需要重传机制,局域网(本身网络稳定性高)
- UDP适合于这样的进程:需要简单的请求-响应通信,而较少考虑流量控制和差错控制。对于需要传送成块数据的进程(如FTP)则不适合使用UDP。
- UDP适合于具有内部流量控制和差错控制机制的进程,如简单文件传输协议TFTP。
- 对多播来说,UDP是一个合适的传输协议。
- UDP常用于交互实时应用,以避免接收报文之间的不一致延时。
- UDP可用于管理进程,如SNMP。
UDP对应的协议:
- DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
DNS工作原理:当DNS客户机需要在程序中使用名称时,它会查询DNS服务器来解析该名称。客户机发送的每条查询信息包括三条信息:包括:指定的DNS域名,指定的查询类型,DNS域名的指定类别。该应用一般不直接为用户使用,而是为其他应用服务,如HTTP,SMTP等在其中需要完成主机名到IP地址的转换。 - SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
- TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务
TCP对应的协议:
- FTP:定义了文件传输协议,使用21端口。常说某某计算机开了FTP服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP服务。
- Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务。如以前的BBS是-纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。
- SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置-中常看到有这么SMTP端口设置这个栏,服务器开放的是25号端口。
- POP3:它是和SMTP对应,POP3用于接收邮件。通常情况下,POP3协议所用的是110端口。也是说,只要你有相应的使用POP3协议的程序(例如Fo-xmail或Outlook),就可以不以Web方式登陆进邮箱界面,直接用邮件程序就可以收到邮件(如是163邮箱就没有必要先进入网易网站,再进入自己的邮-箱来收信)。
- HTTP协议:是从Web服务器传输超文本到本地浏览器的传送协议。
超文本传送协议HTTP
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。HTTP协议的主要特点可概括如下:
支持客户/服务器模式。
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
DNS域名系统
DNS 是一种用于TCP/IP应用程序的分布式数据库,它提供域名到 IP 地址的转换。举例来说,如果你要访问域名math.stackexchange.com,首先要通过DNS查出它的IP地址是151.101.129.69 。
域名服务器
因特网在命名时采用的是层次树状结构的命名方法。任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。
每一个域名都是有标号(label)序列组成,而各标号之间用点(小数点)隔开。如mail.cctv.com,这是中央电视台用于手法电子邮件的计算机的域名,它由三个标号组成,其中标号com是顶级域名,标号cctv是二级域名,标号mail是三级域名。
因特网上的DNS服务器也是按照层次安排的。每一个域名服务器只对域名体系中的一部分进行管辖。根据域名服务器所起的作用,可以把域名服务器划分为下面四种不同的类型。
- 根域名服务器:最高层次的,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助根域名服务器。假定所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。很多情况下,根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。
- 顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名。
- 权限域名服务器:负责一个“区”的域名服务器。
- 本地域名服务器:本地服务器不属于下图的域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器
域名的解析过程
主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以 DNS 客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的 IP 地址,或者是报错,表示无法查询到所需的 IP 地址。
下面举一个例子演示整个查询过程:
假定域名为 m.xyz.com 的主机想知道另一个主机 y.abc.com 的IP地址。例如,主机m.xyz.com打算发送邮件给y.abc.com。这时就必须知道主机y.abc.com的IP地址。查询步骤:
- 主机 m.abc.com 先向本地服务器 dns.xyz.com 进行递归查询。
- 本地服务器采用迭代查询。它先向一个根域名服务器查询。
- 根域名服务器告诉本地服务器,下一次应查询的顶级域名服务器dns.com的IP地址。
- 本地域名服务器向顶级域名服务器dns.com进行查询。
- 顶级域名服务器dns.com告诉本地域名服务器,下一步应查询的权限服务器dns.abc.com的IP地址。
- 本地域名服务器向权限域名服务器dns.abc.com进行查询。
- 权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址。
- 本地域名服务器最后把查询结果告诉m.xyz.com。