在世界上各地,各类各样的电脑运行着各自不一样的操做系统为你们服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们没法合做同样。计算机使用者意识到,计算机只是单兵做战并不会发挥太大的做用。只有把它们联合起来,电脑才会发挥出它最大的潜力。因而人们就千方百计的用电线把电脑链接到了一块儿。 可是简单的连到一块儿是远远不够的,就好像语言不一样的两我的互相见了面,彻底不能交流信息。于是他们须要定义一些共通的东西来进行交流,TCP/IP就是为此而生。TCP/IP不是一个协议,而是一个协议族的统称。里面包括了**IP协议,IMCP协议,TCP协议**,以及咱们更加熟悉的http、ftp、pop3协议等等。电脑有了这些,就好像学会了外语同样,就能够和其余的计算机终端作自由的交流了。
提到协议分层,咱们很容易联想到ISO-OSI的七层协议经典架构,可是TCP/IP协议族的结构则稍有不一样。如图所示 数据库
TCP/IP协议族按照层次由上到下,层层包装。编程
再往下则是硬件层次了,负责网络的传输,这个层次的定义包括网线的制式,网卡的定义等等(这些咱们就不用关心了,咱们也不作网卡),因此有些书并不把这个层次放在tcp/ip协议族里面,由于它几乎和tcp/ip协议的编写者没有任何的关系。发送协议的主机从上自下将数据按照协议封装,而接收数据的主机则按照协议从获得的数据包解开,最后拿到须要的数据。这种结构很是有栈的味道,因此某些文章也把tcp/ip协议族称为tcp/ip协议栈。服务器
在学习协议以前,咱们应该具有一些基本知识。markdown
互联网地址(ip地址)
网络上每个节点都必须有一个独立的Internet地址(也叫作IP地址)。如今,一般使用的IP地址是一个32bit的数字,也就是咱们常说的IPv4标准,这32bit的数字分红四组,也就是常见的255.255.255.255的样式。IPv4标准上,地址被分为五类,咱们经常使用的是B类地址。具体的分类请参考其余文档。须要注意的是IP地址是网络号+主机号的组合,这很是重要。网络
域名系统
域名系统是一个分布的数据库,它提供将主机名(就是网址啦)转换成IP地址的服务。架构
RFC
RFC是什么?RFC就是tcp/ip协议的标准文档,在这里咱们能够看到RFC那长长的定义列表,如今它一共有4000多个协议的定义,固然,咱们所要学习的,也就是那么十几个协议而已。socket
端口号(port)
注意,这个号码是用在TCP,UDP上的一个逻辑号码,并非一个硬件端口,咱们平时说把某某端口封掉了,也只是在IP层次把带有这个号码的IP包给过滤掉了而已。tcp
应用编程接口
如今经常使用的编程接口有socket和TLI。而前面的有时候也叫作“Berkeley socket”,可见Berkeley对于网络的发展有多大的贡献。模块化
首先咱们应该了解到,像TCP/IP这样的协议系统必须负责完成如下任务:
1. 把消息分解为可管理的数据块,而且这些数据块可以有效的经过传输介质。
2. 与网络适配器硬件链接。
3. 寻址,即发送端计算机必须可以定位到接收数据的计算机,接收计算机必须可以识别本身要接收的数据。
4. 将数据路由到目的计算机所在的子网,即便源子网和目的子网分处不一样的物理网络。
5. 执行错误控制、流量控制和确认;对可靠的通讯而言、发送和接收计算机必须可以发现并可以纠正传输错误,并控制数据流。
6. 从应用程序接收数据并传输到网络。
7. 从网络接收数据并传输到应用程序。post
为了实现以上的功能,TCP/IP开发者使用了模块化的设计,因此就制定了协议模型。
ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员本身开发的TCP/IP协议栈得到了更为普遍的应用。如图所示,是TCP/IP参考模型和OSI参考模型的对比示意图。
TCP/IP协议栈是美国国防部高级研究计划局计算机网(Advanced Research Projects Agency Network,ARPANET)和其后继因特网使用的参考模型。ARPANET是由美国国防部(U.S.Department of Defense,DoD)赞助的研究网络。最初,它只链接了美国境内的四所大学。随后的几年中,它经过租用的电话线链接了数百所大学和政府部门。最终ARPANET发展成为全球规模最大的互连网络-因特网。最初的ARPANET于1990年永久性地关闭。
TCP/IP参考模型分为四个层次:应用层、传输层、网络互连层和主机到网络层。如图所示。(四层模型只是标准模型,实际使用中并非惟一的模型,好比RFC 871中描述的ARPAnet模型有3层:网络接口层、主机到主机层、处理/应用层。)
在TCP/IP参考模型中,去掉了OSI参考模型中的会话层和表示层(这两层的功能被合并到应用层实现)。同时将OSI参考模型中的数据链路层和物理层合并为主机到网络层。下面,分别介绍各层的主要功能。
实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求可以提供给其上层-网络互连层一个访问接口,以便在其上传递IP分组。因为这一层次未被定义,因此其具体的实现方法将随着网络类型的不一样而不一样。
网络互连层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能须要沿不一样的路径同时进行分组传递。所以,分组到达的顺序和发送的顺序可能不一样,这就须要上层必须对分组进行排序。
网络互连层定义了分组格式和协议,即IP协议(Internet Protocol)。
网络互连层除了须要完成路由的功能外,也能够完成将不一样类型的网络(异构网)互连的任务。除此以外,网络互连层还须要完成拥塞控制的功能。
在TCP/IP模型中,传输层的功能是使源端主机和目标端主机上的对等实体能够进行会话。在传输层定义了两种服务质量不一样的协议。即:传输控制协议TCP(transmission control protocol)和用户数据报协议UDP(user datagram protocol)。
TCP协议是一个面向链接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其余主机。在发送端,它负责把上层传送下来的字节流分红报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP协议还要处理端到端的流量控制,以免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据。
UDP协议是一个不可靠的、无链接协议,主要适用于不须要对报文进行排序和流量控制的场合。
TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。
应用层面向不一样的网络应用引入了不一样的应用层协议。其中,有基于TCP协议的,如文件传输协议(File Transfer Protocol,FTP)、虚拟终端协议(TELNET)、超文本连接协议(Hyper Text Transfer Protocol,HTTP),也有基于UDP协议的。
IP协议是TCP/IP协议族中最为核心的协议。它提供不可靠、无链接的服务,也即依赖其余层的协议进行差错控制。在局域网环境,IP协议每每被封装在以太网帧中传送。而全部的TCP、UDP、ICMP、IGMP数据都被封装在IP数据报中传送。如图2-3所示:
图2-3 TCP/IP报文封装
图2-4是IP头部(报头)格式:(RFC 791)。
其中:
●版本(Version)字段:占4比特。用来代表IP协议实现的版本号,当前通常为IPv4,即0100。
●报头长度(Internet Header Length,IHL)字段:占4比特。是头部占32比特的数字,包括可选项。普通IP数据报(没有任何选项),该字段的值是5,即160比特=20字节。此字段最大值为60字节。
●服务类型(Type of Service ,TOS)字段:占8比特。其中前3比特为优先权子字段(Precedence,现已被忽略)。第8比特保留未用。第4至第7比特分别表明延迟、吞吐量、可靠性和花费。当它们取值为1时分别表明要求最小时延、最大吞吐量、最高可靠性和最小费用。这4比特的服务类型中只能置其中1比特为1。能够全为0,若全为0则表示通常服务。服务类型字段声明了数据报被网络系统传输时能够被怎样处理。例如:TELNET协议可能要求有最小的延迟,FTP协议(数据)可能要求有最大吞吐量,SNMP协议可能要求有最高可靠性,NNTP(Network News Transfer Protocol,网络新闻传输协议)可能要求最小费用,而ICMP协议可能无特殊要求(4比特全为0)。实际上,大部分主机会忽略这个字段,但一些动态路由协议如OSPF(Open Shortest Path First Protocol)、IS-IS(Intermediate System to Intermediate System Protocol)能够根据这些字段的值进行路由决策。
●总长度字段:占16比特。指明整个数据报的长度(以字节为单位)。最大长度为65535字节。
●标志字段:占16比特。用来惟一地标识主机发送的每一份数据报。一般每发一份报文,它的值会加1。
●标志位字段:占3比特。标志一份数据报是否要求分段。
●段偏移字段:占13比特。若是一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置。
●生存期(TTL:Time to Live)字段:占8比特。用来设置数据报最多能够通过的路由器数。由发送数据的源主机设置,一般为3二、6四、128等。每通过一个路由器,其值减1,直到0时该数据报被丢弃。
●协议字段:占8比特。指明IP层所封装的上层协议类型,如ICMP(1)、IGMP(2) 、TCP(6)、UDP(17)等。
●头部校验和字段:占16比特。内容是根据IP头部计算获得的校验和码。计算方法是:对头部中每一个16比特进行二进制反码求和。(和ICMP、IGMP、TCP、UDP不一样,IP不对头部后的数据进行校验)。
●源IP地址、目标IP地址字段:各占32比特。用来标明发送IP数据报文的源主机地址和接收IP报文的目标主机地址。
●可选项字段:占32比特。用来定义一些任选项:如记录路径、时间戳等。这些选项不多被使用,同时并非全部主机和路由器都支持这些选项。可选项字段的长度必须是32比特的整数倍,若是不足,必须填充0以达到此长度要求。
TCP是一种可靠的、面向链接的字节流服务。源主机在传送数据前须要先和目标主机创建链接。而后,在此链接上,被编号的数据段按序收发。同时,要求对每一个数据段进行确认,保证了可靠性。若是在指定的时间内没有收到目标主机对所发数据段的确认,源主机将再次发送该数据段。
如图2-5所示,是TCP头部结构(RFC 79三、1323)。
图2-5 TCP头部结构
●源、目标端口号字段:占16比特。TCP协议经过使用”端口”来标识源端和目标端的应用进程。端口号可使用0到65535之间的任何数字。在收到服务请求时,操做系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在”众所周知的端口”(Well-Know Port)为用户提供服务。
●顺序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
●确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所指望收到源端的下一个数据字节。
●头部长度字段:占4比特。给出头部占32比特的数目。没有任何选项字段的TCP头部长度为20字节;最多能够有60字节的TCP头部。
●标志位字段(U、A、P、R、S、F):占6比特。各比特的含义以下:
◆URG:紧急指针(urgent pointer)有效。
◆ACK:确认序号有效。
◆PSH:接收方应该尽快将这个报文段交给应用层。
◆RST:重建链接。
◆SYN:发起一个链接。
◆FIN:释放一个链接。
●窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机指望一次接收的字节数。
●TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。
●紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。
●选项字段:占32比特。可能包括”窗口扩大因子”、”时间戳”等选项。
UDP是一种不可靠的、无链接的数据报服务。源主机在传送数据前不须要和目标主机创建链接。数据被冠以源、目标端口号等UDP报头字段后直接发往目的主机。这时,每一个数据段的可靠性依靠上层协议来保证。在传送数据较少、较小的状况下,UDP比TCP更加高效。
如图2-6所示,是UDP头部结构(RFC 79三、1323):
●源、目标端口号字段:占16比特。做用与TCP数据段中的端口号字段相同,用来标识源端和目标端的应用进程。
●长度字段:占16比特。标明UDP头部和UDP数据的总长度字节。
●校验和字段:占16比特。用来对UDP头部和UDP数据进行校验。和TCP不一样的是,对UDP来讲,此字段是可选项,而TCP数据段中的校验和字段是必须有的。
在每一个TCP、UDP数据段中都包含源端口和目标端口字段。有时,咱们把一个IP地址和一个端口号合称为一个套接字(Socket),而一个套接字对(Socket pair)能够惟一地肯定互连网络中每一个TCP链接的双方(客户IP地址、客户端口号、服务器IP地址、服务器端口号)。
如图2-7所示,是常见的一些协议和它们对应的服务端口号。
图2-7 常见协议和对应的端口号
须要注意的是,不一样的应用层协议可能基于不一样的传输层协议,如FTP、TELNET、SMTP协议基于可靠的TCP协议。TFTP、SNMP、RIP基于不可靠的UDP协议。
同时,有些应用层协议占用了两个不一样的端口号,如FTP的20、21端口,SNMP的16一、162端口。这些应用层协议在不一样的端口提供不一样的功能。如FTP的21端口用来侦听用户的链接请求,而20端口用来传送用户的文件数据。再如,SNMP的161端口用于SNMP管理进程获取SNMP代理的数据,而162端口用于SNMP代理主动向SNMP管理进程发送数据。
还有一些协议使用了传输层的不一样协议提供的服务。如DNS协议同时使用了TCP 53端口和UDP 53端口。DNS协议在UDP的53端口提供域名解析服务,在TCP的53端口提供DNS区域文件传输服务。
第一层 物理层
第一层负责最后将信息编码成电流脉冲或其它信号用于网上传输。它由计算机和网络介质之间的实际界面组成,可定义电气信号、符号、线的状态和时钟要求、数据编码和数据传输用的链接器。如最经常使用的RS-232规范、10BASE-T的曼彻斯特编码以及RJ-45就属于第一层。全部比物理层高的层都经过事先定义好的接口而与它通话。如以太网的附属单元接口(AUI),一个DB-15链接器可被用来链接层一和层二。
第二层 数据链路层
数据链路层经过物理网络链路提供可靠的数据传输。不一样的数据链路层定义了不一样的网络和协议特征,其中包括物理编址、网络拓扑结构、错误校验、帧序列以及流控。物理编址(相对应的是网络编址)定义了设备在数据链路层的编址方式;网络拓扑结构定义了设备的物理链接方式,如总线拓扑结构和环拓扑结构;错误校验向发生传输错误的上层协议告警;数据帧序列从新整理并传输除序列之外的帧;流控可能延缓数据的传输,以使接收设备不会由于在某一时刻接收到超过其处理能力的信息流而崩溃。数据链路层实际上由两个独立的部分组成,介质存取控制(Media Access Control,MAC)和逻辑链路控制层(Logical Link Control,LLC)。MAC描述在共享介质环境中如何进行站的调度、发生和接收数据。MAC确保信息跨链路的可靠传输,对数据传输进行同步,识别错误和控制数据的流向。通常地讲,MAC只在共享介质环境中才是重要的,只有在共享介质环境中多个节点才能链接到同一传输介质上。IEEE MAC规则定义了地址,以标识数据链路层中的多个设备。逻辑链路控制子层管理单一网络链路上的设备间的通讯,IEEE 802.2标准定义了LLC。LLC支持无链接服务和面向链接的服务。在数据链路层的信息帧中定义了许多域。这些域使得多种高层协议能够共享一个物理数据链路。
第三层 网络层
网络层负责在源和终点之间创建链接。它通常包括网络寻径,还可能包括流量控制、错误检查等。相同MAC标准的不一样网段之间的数据传输通常只涉及到数据链路层,而不一样的MAC标准之间的数据传输都涉及到网络层。例如IP路由器工做在网络层,于是能够实现多种网络间的互联。
第四层 传输层
传输层向高层提供可靠的端到端的网络数据流服务。传输层的功能通常包括流控、多路传输、虚电路管理及差错校验和恢复。流控管理设备之间的数据传输,确保传输设备不发送比接收设备处理能力大的数据;多路传输使得多个应用程序的数据能够传输到一个物理链路上;虚电路由传输层创建、维护和终止;差错校验包括为检测传输错误而创建的各类不一样结构;而差错恢复包括所采起的行动(如请求数据重发),以便解决发生的任何错误。传输控制协议(TCP)是提供可靠数据传输的TCP/IP协议族中的传输层协议。
第五层 会话层
会话层创建、管理和终止表示层与实体之间的通讯会话。通讯会话包括发生在不一样网络应用层之间的服务请求和服务应答,这些请求与应答经过会话层的协议实现。它还包括建立检查点,使通讯发生中断的时候能够返回到之前的一个状态。
第六层 表示层
表示层提供多种功能用于应用层数据编码和转化,以确保以一个系统应用层发送的信息能够被另外一个系统应用层识别。表示层的编码和转化模式包括公用数据表示格式、性能转化表示格式、公用数据压缩模式和公用数据加密模式。 公用数据表示格式就是标准的图像、声音和视频格式。经过使用这些标准格式,不一样类型的计算机系统能够相互交换数据;转化模式经过使用不一样的文本和数据表示,在系统间交换信息,例如ASCII(American Standard Code for Information Interchange,美国标准信息交换码);标准数据压缩模式确保原始设备上被压缩的数据能够在目标设备上正确的解压;加密模式确保原始设备上加密的数据能够在目标设备上正确地解密。 表示层协议通常不与特殊的协议栈关联,如QuickTime是Applet计算机的视频和音频的标准,MPEG是ISO的视频压缩与编码标准。常见的图形图像格式PCX、GIF、JPEG是不一样的静态图像压缩和编码标准。
第七层 应用层
应用层是最接近终端用户的OSI层,这就意味着OSI应用层与用户之间是经过应用软件直接相互做用的。注意,应用层并不是由计算机上运行的实际应用软件组成,而是由向应用程序提供访问网络资源的API(Application Program Interface,应用程序接口)组成,这类应用软件程序超出了OSI模型的范畴。应用层的功能通常包括标识通讯伙伴、定义资源的可用性和同步通讯。由于可能丢失通讯伙伴,应用层必须为传输数据的应用子程序定义通讯伙伴的标识和可用性。定义资源可用性时,应用层为了请求通讯而必须断定是否有足够的网络资源。在同步通讯中,全部应用程序之间的通讯都须要应用层的协同操做。 OSI的应用层协议包括文件的传输、访问及管理协议(FTAM) ,以及文件虚拟终端协议(VIP)和公用管理系统信息(CMIP)等。