因特网
因特网是当今世界上最大的网络,是”网络的网络”。即因特网是所有网络互连起来的一个巨型网络.
因特网的组成:
● 边缘部分 : 主机
● 核心部分 : 大量网络和连接这些网络的路由器(此路由器不是我们家用的路由器)
以太网
以太网是现在最常用的局域网通信协议,以太网上传输的是MAC帧.由于以太网同一时间只允许一台计算机发送数据,所以必须有一套检测机制,那就是CSMA/CD协议:
1,多点接入: 多台计算机以多点接入的方式连接在一根总线上
2,载波监听: 不管是否正在发送,每个站都必须不停地检测信道
3,碰撞检测 : 边发送边监听
五层网络协议
OSI
开放系统互连基本参考模型,只要遵守这个OSI标准,任何两个系统都能进行通信. OSI是七层协议体系结构,而TCP/IP是一个四层协议体系结构,于是我们采取折中的方法,学习计算机网络原理的时候往往用的是五层协议的体系结构 : 物理层,数据链路层,网络层,传输层和应用层。
五层协议
应用层:为特定应用程序提供数据传输服务,例如 HTTP、DNS 等。数据单位为报文。
传输层:为进程提供通用数据传输服务。由于应用层协议很多,定义通用的传输层协议就可以支持不断增多的应用层协议。运输层包括两种协议:传输控制协议 TCP,提供面向连接、可靠的数据传输服务,数据单位为报文段;用户数据报协议 UDP,提供无连接、尽最大努力的数据传输服务,数据单位为用户数据报。TCP 主要提供完整性服务,UDP 主要提供及时性服务。
网络层:为主机提供数据传输服务。而传输层协议是为主机中的进程提供数据传输服务。网络层把传输层传递下来的报文段或者用户数据报封装成分组。
数据链路层:网络层针对的还是主机之间的数据传输服务,而主机之间可以有很多链路,链路层协议就是为同一链路的主机提供数据传输服务。数据链路层把网络层传下来的分组封装成帧。
物理层:考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异。
OSI
表示层和会话层用途如下:
表示层:数据压缩、加密以及数据描述,这使得应用程序不必关心在各台主机中数据内部格式不同的问题。
会话层:建立及管理会话。
五层协议没有表示层和会话层,而是将这些功能留给应用程序开发者处理。
TCP/IP
它只有四层,相当于五层协议中数据链路层和物理层合并为网络接口层。
TCP/IP 体系结构不严格遵循 OSI 分层概念,应用层可能会直接使用 IP 层或者网络接口层。
数据在各层之间的传递过程
在向下的过程中,需要添加下层协议所需要的首部或者尾部,而在向上的过程中不断拆开首部和尾部。
路由器只有下面三层协议,因为路由器位于网络核心中,不需要为进程或者应用程序提供服务,因此也就不需要传输层和应用层。
五层协议详解:
1)、物理层
计算机的世界里只有0和1,正如你现在所看这篇文章的文字,存储在计算机中也是一大串0和1的组合. 但是这些数字不能在真实的物理介质中传输的,而需要把它转换为光信号或者电信号,所以这一层负责将这些比特流(0101)与光电信号进行转换.
2)、数据链路层
数据链路层通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装程帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。数据在这一层不再是以比特流的形式传输,而是分割成一个一个的帧再进行传输。
将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束:
MAC地址
又称计算机的硬件地址,被固化在适配器(网卡)ROM上的占48位的地址.
MAC地址可以用来唯一区别一台计算机,因为它在全球是独一无二的。
ps : 当一台计算机不止有一个网卡时, MAC地址就不能唯一对应一台计算机了. 例如, 一台计算机装了2个网卡, 一个是用于该计算机与外界通信, 而第二个网卡则用来公司内部局域网通信。 这时候虽然有两个MAC地址, 但是其实是同一台计算机。
分组交换
由于数据在这次曾要被分割成一个一个的帧,由于不同的链路规定了不同的最大帧长,即MTU(最大传输单元),凡是超出这个MTU的帧都必须被分块。 例如一台货车一次能运输5吨的货物,而有条公路限载重2吨,那么你只好分3次运输。
网桥
网桥工作在数据链路层,根据MAC帧的目的地址对收到的帧进行转发和过滤.
以太网交换机
是一种链路层设备,它不会发生碰撞,能根据 MAC 地址进行存储转发。
实际上就是一个多接口的网桥,以太网交换机的每个接口都直接与一个单个主机或另一个集线器相连,可以很容易实现VLAN(虚拟局域网)。
以太网的MAC帧
MAC帧的格式为:
● 目的地址 : 接收方48位的MAC地址
● 源地址 : 发送方48位的MAC地址
● 类型字段 : 标志上一层使用的是什么协议,0x0800为IP数据报
3)、网络层
网络层负责为分组交换网上的不同主机提供通信服务。使用 IP 协议,可以把异构的物理网络连接起来,使得在网络层看起来好像是一个统一的网络。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报,简称数据报。
这里要注意:不要把运输层的“用户数据报UDP”和网络层的“IP数据报”弄混。另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。
网络层的另一个任务就是选择合适的路由,使源主机运输层所传下来的分组,能通过网络层中的路由器找到目的主机。
与IP 协议配套使用的还有三个协议:
地址解析协议ARP(Address Resolution Protocol):ARP 实现由IP 地址得到 MAC 地址。
网际控制报文协议ICMP(Internet Control Message Protocol):ICMP 是为了更有效地转发 IP 数据报和提高交付成功的机会。
Ping 是ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。
Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。
网际组管理协议IGMP(Internet Group Management Protocol)
IP 地址编址方式
IP 地址的编址方式经历了三个历史阶段:
● 分类
● 子网划分
● 无分类
1. 分类
由两部分组成,网络号和主机号,其中不同分类具有不同的网络号长度,并且是固定的。
IP 地址::= {< 网络号 >, < 主机号>}
2. 子网划分
两级划分有以下缺点:
(1) IP 地址空间的利用率低。
(2)给每一个物理网络分配一个网络号会使路由表变得太大
(3)两级的 IP 地址不够灵活。
因此,需要子网划分,通过在主机号字段中拿一部分作为子网号,把两级 IP 地址划分为三级 IP 地址:
(1)在IP 地址中增加了一个“子网号字段”,使两级的IP 地址变成为三级的 IP 地址。
(2)从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位。
(3)通过子网掩码与IP地址相与,可以求得子网号。
IP 地址::= {< 网络号 >, < 子网号 >, < 主机号>}
要使用子网,必须配置子网掩码。一个 B 类地址的默认子网掩码为 255.255.0.0,如果 B 类地址的子网占两个比特,那么子网掩码为 11111111 11111111 11000000 00000000,也就是 255.255.192.0。
注意,外部网络看不到子网的存在。
3. 无分类
无分类编址CIDR 消除了传统 A 类、B 类和C 类地址以及划分子网的概念,使用网络前缀和主机号来对 IP 地址进行编码,网络前缀的长度可以根据需要变化。
IP 地址::= {< 网络前缀号 >, < 主机号>}
CIDR 的记法上采用在IP 地址后面加上网络前缀长度的方法,例如 128.14.35.7/20 表示前 20 位为网络前缀。
CIDR 的地址掩码可以继续称为子网掩码,子网掩码首 1 长度为网络前缀的长度。
一个CIDR 地址块中有很多地址,一个 CIDR 表示的网络就可以表示原来的很多个网络,并且在路由表中只需要一个路由就可以代替原来的多个路由,减少了路由表项的数量。把这种通过使用网络前缀来减少路由表项的方式称为路由聚合,也称为构成超网 。
在路由表中的项目由“网络前缀”和“下一跳地址”组成,在查找时可能会得到不止一个匹配结果,应当采用最长前缀匹配来确定应该匹配哪一个。
4)、传输层
传输层主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。这一层是重中之重,因为数据链路层,网络层这两层的数据传输都是不可靠的,尽最大能力交付的. 什么意思的? 就是它们不负责提交给你的就是正确的数据。然而这一层的TCP协议将要提供可靠传输。
这一层主要重点是两个协议: UDP 和TCP
传输控制协议TCP(Transmisson Control Protocol)--提供面向连接的,可靠的数据传输服务。
用户数据协议UDP(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
UDP的主要特点:
● UDP是无连接的;
● UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
● UDP是面向报文的;
● UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等);
● UDP支持一对一、一对多、多对一和多对多的交互通信;
● UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
TCP的主要特点:
● TCP是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
● 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);
● TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
● TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
● 面向字节流。TCP中的“流”(stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
TCP协议如何来保证传输的可靠性
TCP提供一种面向连接的、可靠的字节流服务。其中,面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信;而字节流服务意味着两个应用程序通过TCP链接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。
对于可靠性,TCP通过以下方式进行保证:
● 数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;
● 对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;
● 丢弃重复数据:对于重复数据,能够丢弃重复数据;
● 应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;
● 超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;
● 流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。
TCP三次握手:
TCP三次握手建立连接(我要和你建立链接,你真的要和我建立链接么,我真的要和你建立链接,成功):
第一次握手:Client向Server发送请求报文,SYN=1,ACK=0,随机产生一个值seq=x,Client进入SYN_SENT状态,等待Server确认。
第二次握手:Server收到请求报文后,如果同意建立连接,则向Client发送连接确认报文,SYN=1,ACK=1,ack=x+1,并随机产生一个值seq=y,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则向Server发送确认报文,ACK=1,ack=y+1,seq=x+1,Server检查ack是否为x+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
Q : 为什么要三次握手,两次不可以吗?
A : 试想一下,A第一次发送请求连接,但是在网络某节点滞留了,A超时重传,然后这一次一切正常,A跟B就愉快地进行数据传输了。 等到连接释放了以后,那个迷失了的连接请求突然到了B那,如果是两次握手的话,B发送确认,它们就算是建立起了连接了。事实上A并不会理会这个确认,因为我压根没有要传数据啊。 但是B却傻傻地以为有数据要来,苦苦等待, 结果就是造成资源的浪费。第三次握手就是为了防止失效的连接请求到达服务器,让服务器错误打开连接。
(1)第一次握手,A向B发送消息后,B收到信息。B可确认A的发信能力和B的收信能力。
(2)第二次握手,B向A发送消息,A收到消息。A可确认A的发信能力和收信能力,A也可确认B的收信能力和发信能力。
(3)第三次握手,A向B发送消息,B接收到消息。B可确认A的收信能力和B的发信能力。
更加接地气的解释就是: A打电话给B
第一次握手: 你好,我是A,你能听到我说话吗
第二次握手: 听到了,我是B,你能听到我说话吗
第三次握手: 听到了,我们可以开始聊天了
三次握手其实就是为了检测双方的发送和接收能力是否正常,你说呢?
TCP四次挥手:
TCP四次挥手断开连接(我要和你断开链接;好的,断吧。我也要和你断开链接;好的,断吧):
第一次挥手:Client发送一个FIN=1,seq=u用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:Server收到FIN后,发送确认报文给Client,ACK=1,seq=v,ack=u+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。此时TCP链接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,等待2
MSL(最大报文存活时间)后进入CLOSED状态。Server收到Client的ACK后进入CLOSED状态,完成四次挥手。
Q : 为什么要四次挥手,而不是两次,三次?
A :首先,由于TCP的全双工通信,双方都能作为数据发送方。 A想要关闭连接,必须要等数据都发送完毕,才发送FIN给B。(此时A处于半关闭状态)
然后,B发送确认ACK,并且B此时如果要发送数据,就发送(例如做一些释放前的处理)
再者,B发送完数据之后,发送FIN给A。 (此时B处于半关闭状态)
然后,A发送ACK,进入TIME-WAIT状态
最后,经过2MSL时间后没有收到B传来的报文,则确定B收到了ACK了。(此时A,B才算是处于完全关闭状态)
PS : 仔细分析以上步骤就知道为什么不能少于四次挥手了。
Q : 为什么要等待2MSL(Maximum Segment Lifetime)时间,才从TIME_WAIT到CLOSED?
A : 在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
更加接地气的解释:
第一次挥手:
A告诉B,我没数据发了,准备关闭连接了,你要发送数据吗
第二次挥手:
B发送确认应答,如果有数据则再发送最后的数据
第三次挥手:
B告诉A,我也要关闭连接了
第四次挥手:
A告诉B你可以关闭了,我这边也关闭了
5)、应用层
应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等等。
DNS 能将域名(例如,www.jobbole.com)解析成IP地址.
域名服务器分类
根域名服务器: 最高层次的域名服务器
顶级域名服务器: 如其名
权限域名服务器: 负责一个区的应服务器
本地域名服务器: 主机发送DNS查询请求就是发给它
DNS查询
● 主机向本地域名服务器的查询一般都是采用递归查询
● 本地域名服务器向根域名服务器的查询通常是采用迭代查询
递归查询:
B问A广州怎么去,A不知道,A就问C,C不知道就问D...直到知道了再一层一层转告直到A告诉B。
迭代查询:
B问A广州怎么去,A不知道,A就告诉你可以去问C,然后B就去问C,C不知道,C就告诉你可以去问D,然后B就去问D...直到B知道为止。
DNS查询例子: 域名为x.tom.com的主机想知道y.jerry.com的IP地址:
1,主机x.tom.com先向本地域名服务器dns.tom.com进行递归查询
2,本地域名服务器采用迭代查询. 它先问一个根域名服务器
3,根域名服务器告诉它,你去问顶级域名服务器dns.com
4,本地域名服务器问顶级域名服务器dns.com
5,顶级域名服务器告诉它,你去问权限域名服务器dns.jerry.com
6,本地域名服务器问权限域名服务器dns.jerry.com
7,权限域名服务器dns.jerry.com告诉它所查询的主机的IP地址
8,本地域名服务器把查询结果告诉主机x.tom.com
在浏览器中输入www.baidu.com后执行的全部过程
现在假设如果我们在客户端(客户端)浏览器中输入http://www.baidu.com,而baidu.com为要访问的服务器(服务器),下面详细分析客户端为了访问服务器而执行的一系列关于协议的操作:
1)、客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。
2)、在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
3)、客户端的网络层不用关系应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,我不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。
4)、客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。