计算机网络是电脑相互连接组成的,这些电脑叫做主机,就像正常情况下两个人要用同一种语言交流一样,主机之间的联系也要按照相同的标准才行,这些标准叫做协议。为了实现主机之间的联系,网络模型每一层都有各自的功能,对应于各种各样的协议。所有的协议加起来就构成了互联网的核心,统称为"互联网协议"(Internet Protocol Suite)。
网络模型用来解释计算机网络之间进行通信的规则。网络模型一般是指OSI七层参考模型和TCP/IP四层参考模型。
传输层,会话层,表示层,应用层实现的是端到端的功能(应用—应用),物理层,数据链层,网络层实现的是点到点的功能(主机—主机) 。帧是数据链路层的处理单元,报文是传输层的处理单元,比特是物理层的处理单元,消息是应用层的处理单元。
IP协议是网络层的协议。
通信过程中,每层协议都要加上一个数据首部(header),称为封装(Encapsulation):
解封装,就是封装的逆过程,拆解协议包,处理包头中的信息:
物理层收到的比特流会由数据链接层进行解析,一组电信号构成一个数据包,叫做帧。每一帧分成两个部分:标头(Head)和数据(Data)。Head包含数据包的一些说明项,比如发送者、接收者、数据类型等等,Data则是数据包的具体内容。这种数据包又叫做以太网数据包。
数据包是在网卡和网卡之间传输的,每一块网卡都拥有独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。接收者的MAC地址通过ARP协议(网络层)获取,数据包的标头部分存储着发送者和接收者的网卡地址,以太网会把数据包发给本网络中的每一台主机,让它们自行来解析标头,看接收者的地址是否和自己一致,如果一致,就接收这个数据包,做进一步处理,否则就丢弃掉。这一过程叫做广播。
这种低效率的数据传输仅限于同一子网络下,如果发送者和接收者并不处于同一子网络下,数据包就要通过路由的方式先发送到子网络下,之后再广播到接收者。但是互联网是由无数的子网络构成的,如何区分这么多的MAC地址归属于哪一个子网络呢?
MAC地址本身并不能做到这一点,它至于厂商有关,与所处网络无关。
于是网络层引进了一套新的地址专门用来区分不同的子网络,称为网络地址,简称网址。网络地址与网卡地址是各自独立的,二者并没有任何的联系。由网址确定子网络,由MAC地址确定主机,通过二者的随机组合,就可以将数据包准确的发送给接收者。
规定网络地址的协议叫做IP协议。由IP协议规定的地址就叫做IP地址。常见的IP地址分为IPv4与IPv6两大类。
按照TCP/IP(Transport Control Protocol/Internet Protocol,传输控制协议/Internet协议)协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。习惯上,我们用分成四字段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。
IP地址 = 网络地址 + 主机地址。互联网上的每一台计算机,都会分配到一个IP地址。网络地址是因特网协会的ICANN(the Internet Corporation for Assigned Names and Numbers)分配的,保证网络地址的全球唯一性。主机地址是由各个网络的系统管理员分配。网络地址的唯一性与网络内主机地址的唯一性确保了IP地址的全球唯一性。
IP地址分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同。
处于同一个子网络的电脑,它们IP地址中的网络地址必定是相同的。为了标识IP地址的网络部分和主机部分,要和子网掩码(subnet mask)结合。子网掩码与IP地址类似,也是32bit的数字,与IP地址对应,它的网络部分全是1,主机部分全是0。通过子网掩码我们就知道IP地址中的网络地址占的位数到底是8还是16还24。
一个比较简单的运算方法是对它们各自的IP地址和子网掩码进行AND运算(1+1=1,1+0=0,0+0=0),然后相互比较是否相同。这种计算的本质其实就是在比较网络地址,只不过更方便机器判断。举例:
主机A——IP:202.194.128.9,子网掩码:255.255.255.0
主机B——IP:202.194.128.14,子网掩码:255.255.255.0
计算A:1100 1010.1100 0010.1000 0000.0000 1001 AND 1111 1111.1111 1111. 1111 1111 .0000 0000
= 11001010.1100 0010.1000 0000 .0000 0000 即 202.194.128.0
计算B:1100 1010.1100 0010.1000 0000.0000 1101 AND 1111 1111.1111 1111. 1111 1111 .0000 0000
= 11001010.1100 0010.1000 0000 .0000 0000 即 202.194.128.0
结果:A与B的网络标识计算结果相同,它们处于同一网段。
32位地址资源有限,IPv6作为下一代互联网协议,将IP地址长度从32位扩展到128位,支持更多级别的地址层次、更多的可寻址节点数以及更简单的地址自动配置。
总得来说,IP协议的目的就是为每一台计算机分配IP地址并且确定哪些地址属于同一子网络。
根据IP协议发送的数据,就叫做IP数据包,IP数据包包含一个完整的IP信息。
ARP协议同样是网络层的协议。
数据链接层收到网络层封装好的数据包,首先就要对其进行MAC地址的封装,如何通过IP来确定MAC地址就是ARP协议的任务。分为两种情况:
总之,有了ARP协议之后,我们就可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机之上了。
有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。但是每台主机上都有很多个程序,不同的程序发送的数据如何区分呢?
端口(port)就是用来专门解决这个问题的, 传输层实现发送端和接收端之间的数据分组传送,负责保证实现数据包无差错、按顺序、无丢失和无冗余地传输到目标端口。
如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536个,正好16个二进制位。
在Internet上,各主机间通过TCP/IP协议发送和接收数据包,各个数据包根据其目的主机的ip地址来进行互联网络中的路由选择,把数据包顺利的传送到目的主机。大多数操作系统都支持多程序(进程)同时运行,主机通过端口就可以将数据包发送给目标应用。
"传输层"的功能,就是建立"端口到端口"的通信。相比之下,“网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做"套接字”(socket)。有了它,就可以进行网络应用程序开发了。
传输层的TCP和UDP协议就主要负责对端口信息进行封装。
TCP和UDP都属于传输层的协议,用来实现端到端的信息传输。
TCP——传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
UDP——用户数据报协议(User Datagram Protocol)是一中简单的,面向数据报的传输层协议。
TCP/IP 和UDP最大的区别就是:TCP是面向连接的,UDP是无连接的。TCP协议和UDP协议各有所长、各有所短,适用于不同要求的通信环境。
UDP只是简单地将数据源和端口信息封装成数据包中,每个数据报的大小在限制在64k。UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号, 发送端不知道数据是否会正确接收,属于不可靠协议。
面向连接的TCP协议提供可靠的数据传输,保证数据无差错、不丢失、不重复、按循序到达。面向连接就是在正式通信前必须要与对方建立起连接,是按照电话系统建模的。比如你给别人打电话,必须等线路接通了,对方拿起话筒才能开始相互通话。
TCP | UDP | |
---|---|---|
数据格式 | 字节流 | 数据报 |
是否连接 | 面向连接 | 无连接 |
传输可靠性 | 可靠的 | 不可靠的 |
应用场景 | 传输大量数据 | 少量数据 |
速度 | 慢 | 快 |
流量控制 | 有 | 无 |
TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。
字段 | 含义 |
---|---|
URG | 紧急指针是否有效。为1,表示某一位需要被优先处理 |
ACK | 确认号是否有效,一般置为1。 |
PSH | 提示接收端应用程序立即从TCP缓冲区把数据读走。 |
RST | 对方要求重新建立连接,复位。 |
SYN | 请求建立连接,并在其序列号的字段进行序列号的初始值设定。建立连接,设置为1 |
FIN | 希望断开连接。 |
ACK(Acknowledgement)、SYN(Synchronize Sequence Numbers)和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。
确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。
序列号和确认号又是保障数据的正确性以及窗口滑动机制的最基本的根据。
TCP在正式通信前必须要与对方建立起连接(1对N),TCP的三次握手:
至此,三次握手结束,客户端和服务端已经建立起了连接。
通信结束后,TCP为了保证数据的正常中断,采用了四次挥手机制:
至此,四次挥手结束,TCP连接正式断开。
DNS,域名系统(Domain Name System)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
IP地址是网络上标识站点的数字地址,但是不方便记忆和使用。为了方便记忆,人们采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。
假定域名为m.xyz.com的主机想知道另一个主机y.abc.com的IP地址。例如,主机m.xyz.com打算发送邮件给y.abc.com。这时就必须知道主机y.abc.com的IP地址。
如果在m.xyz.com的主机上不久前已经有用户查询过y.abc.com的IP地址,那么本地域名服务器就不必向根域名服务器重新查询y.abc.com的IP地址,而是直接把告诉缓存中存放的上次查询结果(即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。
整个查询过程共用到了8个UDP报文。为了提高DNS查询效率,并减轻服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
HTTP协议详解
超文本传输协议(HTTP)是一种通信协议,它用来将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。HTTP诞生之初主要是应用于WEB端内容获取。HTTP协议使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。特点:
HTTP 协议有 HTTP/1.0 版本和 HTTP/1.1 版本。 HTTP1.1 默认保持长连接(HTTP persistent connection,也翻译为持久连接),数据传输完成了保持 TCP 连接不断开(不发 RST 包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。在 HTTP/1.0 中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。 从 HTTP/1.1 起,默认使用的是长连接, 用以保持连接特性。
在Internet中所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中应用层的协议也不例外。HTTP默认的端口号为80。HTTP协议工作于客户端-服务端架构上。
浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。Web服务器根据接收到的请求后,向客户端发送响应信息。
浏览器显示的内容都有 HTML、XML、GIF、Flash 等,浏览器是通过 MIME Type 区分它们,决定用什么内容什么形式来显示。MIME Type 是该资源的媒体类型。
HTTP在开始传输之前,首先需要建立TCP连接,也就是所谓的三次握手,在HTTP在传输完成之间不会断开TCP连接。
由请求行(request line)、请求头部(header)、空行和请求数据四个部分组成:
常见的请求方法有三种(HTTP1.1已经将请求方法扩展到9种):
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文:
URL(Uniform Resource Locator),统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。URL用来作为万维网的地址。
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
URL 的一个例子:
http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff