【网络编程系列1】网络协议
由于第一次有勇气尝试写技术文章,很多要领都掌握的都不好,很多内容都是从网友那里借鉴来的,这次花了几小时,自己一边总结一边写,很多以前没注意到的细节都,让我明白了,原来懂、会做和真正写出来是完全不同的。感谢各位园友的无私奉献。
学习之路还很长,希望这是一个好的开始。
一. ISO/OSI模型
在20世纪80年代早起,国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互联为网络的标准框架,简称OSI, 即开放式通信系统互联网参考模型(Open System Interconnection, OSI/RM, Open Systems Interconnection Reference Model)。
OSI模型将计算机网络体系结构划分为七层:即物理层(Physical)、数据链路层(Data Link)、网络层(Network)、传输层(Transport)、会话层(Session)、表示层(Presentation)、应用层(Application)。如图所示
二. TCP/IP模型
1.什么是TCP/IP模型?
TCP/IP协议是美国国防部高级研究计划局计算机网(Advanced Research Projects Agency Network,ARPANET)和其后继因特网使用的参考模型。ARPANET是由美国国防部(U.S. Department of Defense,Dod)赞助的研究网络。最初它只连接了美国境内的四所大学。随后的几年中,它通过租用的电话线连接了数百所大学和政府部门。最终ARPANET发展呈全球规模最大的互联网络,也就是现在我们所说的因特网。最初的ARPANET与1990年永久性的关闭。
TCP/IP参考模型是一个抽象的分层模型,在这个模型中,所有的TCP/IP系列网络协议都被归类到4个抽象的层中。每一个抽象层建立在低一层提供的服务之上,并为高一层提供服务。
完成一些特定任务的话,需要众多协议协同工作,而这些协议分布在参考模型不同的层中,因此我们有时候也叫它为一个协议栈。
TCP/IP参考模型为TCP/IP协议栈量身订做的。 比如其中的IP协议,只需要关心如何使得数据能够跨越本地网络边界的问题,而不需要关心如何利用传输媒体,数据如何传输。整个TCP/IP协议栈则是负责数据如何通过许许多多个点对点通路(1个点对点的通路,也称为1"跳",1 hop)的顺利传输,由此不同的网络成员能够在许多“跳”的基础上,建立相互的数据通路。
如果想要分析想要分析更普遍的网络通信的话,ISO的OSI模型可以起到更好的帮助作用。
因特网协议组是一组实现支持因特网和商业网络运行的协议栈的网络传输协议,它有时也被称为TCP/IP协议组,这个名称来源于其中两个最重要的协议:传输控制协议(TCP)和因特网协议(IP),它们也是最先定义的两个协议。
同其他协议一样,网络协议也可以看成是一个多层的组合,每一层负责解决一组数据传输中的一组问题,并且向使用这些低层服务的高层,提供定义好的服务。高层逻辑上与用户更为接近,所处理的数据也更为抽象,它们依赖于低层将数据转换为能够进行物理控制的形式。
网络传输协议能够大致匹配到一些喜欢使用的固定的7层OSI模型。然而并不是所有的层,都能够很好的与基于IP的网络对应(根据应用的设计和支持网络的不同,它们确实是涉及到不同的层),并且有一些人认为试图将因特网协议组对应到OSI,会带来混淆,而不是有所帮助。
2.TCP/IP的层次结构
TCP/IP参考模型可以分为四个层次:1.应用层(Application Layer)、2.传输层(Transport Layer)、3.网络层(Internet Layer)、4.数据链路层(Link Layer)。
TCP/IP分层 | 协议 | OSI 分层 | ||||
---|---|---|---|---|---|---|
应用层 | FTP | SMTP | Telnet | DNS | SNMP | 7 |
传输层 | TCP | UDP | 4 | |||
网络层 | IP, ICMP (RIP, OSPF) | 3 | ||||
ARP, RARP | ||||||
链路层 | Ethernet | Token Bus |
Token Ring |
FDDI | WLAN | 2 |
1 |
物理层
数据链路层
数据链路层实际上并不是因特网协议组中的一部分,但是它是数据包从一个网络层设备传输到另一个网络层设备的方法,这个过程能够在网卡的软件驱动之中控制,也可以在韧体或专用芯片中控制。
将完成如:其中一端,完成添加报头准备发送、通过物理媒介实际发送这些数据链路功能。另一端,链路层完成数据帧的接收,去除报头,并且将之接收到的包传输到网络层。
网络层
该层负责转发和路由,从该层往下看,可以认为底下存在的是一个,无连接不可靠的端对端的数据通路。最核心的当然是IP协议。此外还有ICMP,RIP,OSPF,IS-IS,BGP,ARP,RARP 等等。
正如最初定义的,网络层解决在一个单一网络上传输数据包的问题。随着因特网思想的出现,在这个层上添加了附加的功能,也就是将数据源网络传输到目的网络。
在因特网协议组上,IP完成数据从源发送到目的的基本任务。
一些IP承载的协议,如ICMP(用来发送关于IP发送的诊断信息)和IGMP(用来管理多播数据),它们位于IP层之上但是完成网络层的功能,这表明了因特网和OSI模型之间的不兼容性。所有的路由协议,如BGP、 OSPF、和RIP实际上也是网络层的一部分,尽管似乎它们应该属于更高的协议栈。
传输层
该层提供端到端的通信。最重要的传输层协议是控制传输协议TCP。
传输层的协议能够解决诸如可靠性(“数据是否已经到达目的地”),保证数据按照正确的顺序到达这样的问题。在TCP/IP协议族中,传输协议也包括所给数据应该送给哪一个应用程序。
- 传输控制协议TCP (Transport Control Protocol) - 数据流传输(面向连接,可靠):
它提供了一种可靠的字节流保证数据完整、无损并且按顺序到达。TCP尽量连续不断第测试网络的负载,并且控制发送数据的速度,以避免网络过载。
- 用户数据报文协议UDP (User Datagram Protocol)- 数据报文传输(无连接,不可靠):
UDP是一个无连接,不可靠的协议,不是因为它真的不可靠,而是因为它不不检查数据包是否已经到达目的地,并且也不保证它们按顺序到达。如果一个程序需要这些特点,它必须自己提供TCP。
UDP的典型应用,比如流媒体(音频和视频等),这样按时到达比可靠性更重要的应用,或者DNS查找这样的简单查询/响应应用,如果建立可靠的连接所做的工作是不成比例的大。
TCP和UDP都用来支持一些高层的应用,任何给定网络地址的应用,通过它们的TCP或者UDP的端口号区分,根据端口与特定的应用程序相联系。
应用层
应用层是大多数普通或网络程序,为了通过网络与其他程序通信所使用的层,这个层的处理过程是应用特有的。数据从网络相关的程序,以这种程序内部应用的格式传输过来,然后编码成标准协议的格式。
一个应用程序的数据,被编码成标准的应用层协议,它将被传送到IP栈下一层。
在传输层中,应用程序最常用的就是TCP或者UDP了,与服务器应用上相对应的一个公开的端口号一一对应。
在连接外部的客户端程序,通常使用的都是系统分配的一个随机端口号,监听一个端口,然后通过服务器将那个端口,发送到另一个副本,以建立对等连接的应用,
该层包括所有的应用程序协同工作,利用基础网络交换应用程序专用的数据协议。例如:
- HTTPS (Hypertext Transafer Protocol over Secure Socket Layer, or HTTP over SSL),安全超文本传输协议
- HTTP (Hypertext Transfer Protocol),超文本传输协议
- TELNET (TeleType over the Network),网络电传,通过一个终端(terminal)登录到网络上(运行在TCP协议上)
- FTP (File Transfer Protocol),文件传输协议,(运行在TCP协议上)
- SMTP (Simple Mail Transfer Protocol),简单邮件传输协议,用来发电子邮件,(运行在TCP协议上)
- DNS (Domain Name Service),域名服务,用来完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)
- NTP (Network Time Protocol),用于网络同步(运行在UDP协议上)
- SNMP (Simple Network Management Protocol),简单网络管理协议,用来网络信息的收集和网络管理
3. 发展历程
因特网协议组来自于二十世纪七十年代早期DARPA所作的工作。在构建了APRANET先驱之后,DARPA开始了其它数据传输技术的研究。1972年,Robert E. Kahn被DARPA的信息技术处理办公室雇佣,在那 里他研究卫星数据包网络和地面无线数据包网络,并且意识到能够在它们之间沟通的价值。在1973年春天,已有的ARPANET网络控制程序(NCP)协议的开发者Vinton Cerf加入到Kahn为ARPANET设计下一代协议而开发开放互连模型的工作中。
到了1973年夏天,Kahn和Cerf很快就开发出了一个基本的改进形式,其中网络协议之间的不同通过使用一个公用互联网络协议而隐藏起来,并且可靠性由主机保证而不是象ARPANET那样由网络保证。(Cerf 称赞Hubert Zimmerman和Louis Pouzin(CYCLADES网络的设计者)在这个设计上发挥了重要影响。)
由于网络的作用减少到最小的程度,就有可能将任何网络连接到一起,而不用管它们不同的特点,这样就解决了Kahn最初的问题。(一个流行的说法提到Cerf和Kahn工作的最终产品TCP/IP将在运行“两个罐子和一根弦”上,实际上它已经用在信鸽上。一个称为网关(后来改为路由器以免与网关混淆)的计算机为每个网络提供一个接口并且在它们之间来回传输数据包。
这个设计思想更细的形式由Cerf在斯坦福的网络研究组的1973年–1974年期间开发出来。(处于同一时期的诞生了PARC通用包协议组的施乐PARC早期网络研究工作也有重要的技术影响;人们在两者之间摇摆不定。)
DARPA于是与BBN、斯坦福和伦敦大学签署了协议开发不同硬件平台上协议的运行版本。有四个版本被开发出来——TCP v1、TCP v2、在1978年春天分成TCP v3和IP v3的版本,后来就是稳定的TCP/IP v4——目前因特网仍然使用的标准协议。
1975年,两个网络之间的TCP/IP通信在斯坦福和伦敦大学(UCL)之间进行了测试。1977年11月,三个网络之间的TCP/IP测试在美国、英国和挪威之间进行。在1978年到1983年间,其它一些TCP/IP原型在多个研究中心之间开发出来。ARPANET完全转换到TCP/IP在1983年1月1日发生。
1984年,美国国防部将TCP/IP作为所有计算机网络的标准。1985年,因特网架构理事会举行了一个三天有250家厂商代表参加的关于计算产业使用TCP/IP的工作会议,帮助协议的推广并且引领它日渐增长的商业应用。
2005年9月9日Kahn和Cerf由于他们对于美国文化做出的卓越贡献被授予总统自由勋章。
4. IP网是怎么吃对竞争的网络
在长期的发展过程中,IP逐渐取代其它网络。这里是一个简单的解释。IP传输通用数据。数据能够用于任何目的,并且能够很轻易地取代以前由专有数据网络传输的数据。下面是一个普通的过程:
一个专有的网络开发出来用于特定目的。如果它工作很好,用户将接受它。
为了便利提供IP服务,经常用于访问电子邮件或者聊天,通常以某种方式通过专有网络隧道实现。隧道方式最初可能非常没有效率,因为电子邮件和聊天只需要很低的带宽。
通过一点点的投资IP 基础设施逐渐在专有数据网络周边出现。
用IP取代专有服务的需求出现,经常是一个用户要求。
IP替代品过程遍布整个因特网,这使IP替代品比最初的专有网络更加有价值(由于网络效应)。
专有网络受到压制。许多用户开始维护使用IP替代品的复制品。
IP包的间接开销很小,少于1%,这样在成本上非常有竞争性。人们开发了一种能够将IP带到专有网络上的大部分用户的不昂贵的传输媒介。
大多数用户为了削减开销专有网络被取消。
专有网络的死党被迫接受。
三. 总结
现在通过一个简单的例子来总结一个学习到的内容。
例: 在浏览器中输入一个网址: http://www.baidu.com 的时候,也就是意味着浏览器要向百度的服务器发送一个网页数据包,可是发送数据包,需要对方的IP地址,但是我不知道IP地址是多少,此时应用层中的DNS协议会帮助我们解析之前输入的网址,此时就会发送一个DNS数据包到DNS服务器,DNS服务器会做出响应,将百度的地址返回给我们[115.239.210.27],这样我们就知道需要通信的主机的IP地址了。
浏览网页的时候,默认使用的协议时HTTP协议,HTTP数据包会嵌入到TCP数据包中,此时我们发送的HTTP数据包内容。
GET http://www.baidu.com/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Zune 4.7; InfoPath.3; MS-RTC LM 8)
Accept-Encoding: gzip, deflate, peerdist
Proxy-Connection: Keep-Alive
Host: www.baidu.com
Cookie: BDSFRCVID=H1K_JgC2l434o0a3SlYrhIyDwFLxPM7C3J; H_BDCLCKID_SF=tJAt_C8htDv5HTuRj63D5JcH-UnLqMkDWaOZ0h8-aI-5MbAx-jb6hhFXM-r80nblBTbT2C3nthF0HPonHj8Bej5L3J; BAIDUID=C0E879D1A40237E70E9FA559D40EE0AC:FG=1; BDUT=w5n3C0E879D1A40237E70E9FA559D40EE0AC13914a661370; BDUSS=FEQVdNdjllMTYyYlRxY3ZZbW1hM2htemdqZFVJcWRLWmFBaEtqd1FoTDNXeE5SQUFBQUFBJCQAAAAAAAAAAAoqyysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEwLjI2LjE5Ny43NwAAAADAxFInAAAAAPcNJlD3DSZQYV; BDRCVFR[eYjbPwSqvSs]=2g3v5sBI-NCpv4EILPoXi4WUvY; Hm_lvt_9f14aaa038bbba8b12ec2a4a3e51d254=1344671219756; Hm_lpvt_9f14aaa038bbba8b12ec2a4a3e51d254=1344671219756
X-P2P-PeerDist: Version=1.0
传输层:
TCP数据包需要知道双方的端口号,源:1025(随机) 目的:80(默认), TCP数据包 = 【报头】+【HTTP数据包】组成。
接下来, 需要将TCP数据包传到网络层。
网络层:
IP数据包需要知道双方的IP地址,源:192.160.1.1, 目的:115.239.210.27, IP数据包 = 【IP地址信息】+ 【TCP数据包】
接下来, 需要将IP数据包传到数据链路层。
数据链路层:
以太网数据包需要知道双方的MAC(物理地址),源:【00-19-21-C4-BA-DB】 接收方网关(通过ARP地址解析得到):【01-03-21-44-AC-CA】, 以太网数据包 = 【MAC地址信息】 + 【以太网数据包】
经过多个网关的转发后,终于找到百度服务器了【115.239.210.27】,服务器接收到以太网数据包——>将IP数据包传给网络层——>将TCP数据包传送给传输层——>将HTTP数据包传送给服务器,
最后服务器做出【HTTP响应】,再用TCP协议发送给客户端(浏览器),浏览器同样的过程读取到HTTP响应的内容(HTTP响应数据包),浏览器将对收到的HTML页面进行解析,把网页呈现给用户,
这样就完成了一次网络通信了。
两个因特网主机通过两个路由器和对应的层连接。各主机上的应用通过一些数据通道相互执行读取操作。
沿着不同的层应用数据的封装递减