发布新日志

  • 网络学习日志(五)--OSI七层模型和TCP/IP四层模型

    2009-08-05 10:14:29

        网络协议设计者不应当设计一个单一、巨大的协议来为所有形式的通信规定完整的细节,而应把通信问题划分成多个小问题,然后为每一个小问题设计一个单独的协议。这样做使得每个协议的设计、分析、时限和测试比较容易。协议划分的一个主要原则是确保目标系统有效且效率高。为了提高效率,每个协议只应该注意没有被其他协议处理过的那部分通信问题;为了主协议的实现更加有效,协议之间应该能够共享特定的数据结构;同时这些协议的组合应该能处理所有可能的硬件错误以及其它异常情况。为了保证这些协议工作的协同性,应当将协议设计和开发成完整的、协作的协议系列(即协议族),而不是孤立地开发每个协议。

        OSI七层模型

      在网络历史的早期,国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)共同出版了开放系统互联的七层参考模型。一台计算机操作系统中的网络过程包括从应用请求(在协议栈的顶部)到网络介质(底部) ,OSI参考模型把功能分成七个分立的层次。图1表示了OSI分层模型。

     

    图1 OSI七层参考模型


      OSI模型的七层分别进行以下的操作:

      第一层 物理层

      第一层负责最后将信息编码成电流脉冲或其它信号用于网上传输。它由计算机和网络介质之间的实际界面组成,可定义电气信号、符号、线的状态和时钟要求、数据编码和数据传输用的连接器。如最常用的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)等。


      TCP/IP分层模型

      TCP/IP分层模型(TCP/IP Layening Model)被称作因特网分层模型(Internet Layering Model)、因特网参考模型(Internet Reference Model)。图2表示了TCP/IP分层模型的四层。

     

    图2 TCP/IP四层参考模型


      TCP/IP协议被组织成四个概念层,其中有三层对应于ISO参考模型中的相应层。ICP/IP协议族并不包含物理层和数据链路层,因此它不能独立完成整个计算机网络系统的功能,必须与许多其他的协议协同工作。

      TCP/IP分层模型的四个协议层分别完成以下的功能:

      第一层 网络接口层

      网络接口层包括用于协作IP数据在已有网络介质上传输的协议。实际上TCP/IP标准并不定义与ISO数据链路层和物理层相对应的功能。相反,它定义像地址解析协议(Address Resolution Protocol,ARP)这样的协议,提供TCP/IP协议的数据结构和实际物理硬件之间的接口。

      第二层 网间层

      网间层对应于OSI七层参考模型的网络层。本层包含IP协议、RIP协议(Routing Information Protocol,路由信息协议),负责数据的包装、寻址和路由。同时还包含网间控制报文协议(Internet Control Message Protocol,ICMP)用来提供网络诊断信息。

      第三层 传输层

      传输层对应于OSI七层参考模型的传输层,它提供两种端到端的通信服务。其中TCP协议(Transmission Control Protocol)提供可靠的数据流运输服务,UDP协议(Use Datagram Protocol)提供不可靠的用户数据报服务。

      第四层 应用层

      应用层对应于OSI七层参考模型的应用层和表达层。因特网的应用层协议包括Finger、Whois、FTP(文件传输协议)、Gopher、HTTP(超文本传输协议)、Telent(远程终端协议)、SMTP(简单邮件传送协议)、IRC(因特网中继会话)、NNTP(网络新闻传输协议)等。

     

  • 网络学习日志(三)--http协议中的get和post

    2009-07-29 11:26:46

    get和post


    概述:

    前面的http协议介绍中已经学到了,http协议结构如下:

    <request line>

    <headers>

    空行

    [<content>]

    request line 用来说明请求类型、要访问的资源,以及http版本;

    headers是服务器要使用的附加信息,如charset、connection等;

    下面是两个例子,分别使用get、post请求方式

    GET /index.php?uid-22578-action-viewspace-itemid-141083 HTTP/1.1
    Accept: image/gif, image/jpeg, image/pjpeg, application/xaml+xml, */*
    Accept-Language: zh-cn
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
    Host: www.51testing.com
    Connection: Keep-Alive

    POST /batch.comment.php HTTP/1.1
    Accept: image/gif, image/jpeg, image/pjpeg, application/xaml+xml, */*
    Accept-Language: zh-cn
    Content-Type: application/x-www-form-urlencoded
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
    Host: www.51testing.com
    Content-Length: 169
    Connection: Keep-Alive

    rates=0&message=%B1%C8%BD%CF%BC%F2%B5%A5%B5%C4%D2%BB%D0%A9%B3%A3%D3%C3sql%D3%EF%BE%E4&nickname=angelets&seccode=3878&itemid=141083&submitcomment=%CC%E1%BD%BB%C6%C0%C2%DB

    可以看到,上面的get只是在请求一个html页面的浏览,无数据提交;

    而post是有content内容的rates=后面的部分,可以看到nickname=angelets,密码、提交的submitcomment是已经加密过的;

    下面说一下post和get在使用中的一些区别:

    (1)   在客户端,Get方式通过URL提交数据,数据URL中可以看到;POST方式,数据放置在entity content内提交。

    (2)   GET由于是通过url提交数据的,因此数据大小受浏览器客户端的限制(微软support网站上说:Microsoft Internet Explorer has a maximum uniform. resource locator (URL) length of 2,083 characters)最多只能有2083字节。而POST不通过url提交数据,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,例如,tomcat默认设置为2M。

    (3)   安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

    (4)   安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一 URL 的多个请求应该返回同样的结果完整的定义并不像看起来那样严格换句话说GET 请求一般不应产生副作用从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源比如,新闻站点的头版不断更新虽然第二次请求会返回不同的一批新闻该操作仍然被认为是安全的和幂等的因为它总是返回当前的新闻反之亦然。POST 请求就不那么轻松了POST 表示可能改变服务器上的资源的请求仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解)。
    http://www.cnblogs.com/stu-acer/archive/2006/08/28/488802.html

    (5)表单提交中的post和get。

         get是从服务器上获取数据,post是向服务器传送数据。

         对于表单的提交方式,在服务器端只能用Request.QueryString来获取Get方式提交来的数据,用Post方式提交的数据只能用Request.Form来获取。

         一般来说,尽量避免使用Get方式提交表单,因为有可能会导致安全问题。比如说在登陆表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。但是在分页程序中,用Get方式就比用Post好。

     

  • 网络学习日志(二)---http协议四个方面的特性

    2009-07-14 17:32:42

    由于有个项目涉及到TCP、HTTP、Soap的一些东西,于是回顾了一下以前曾经学过的东西,并学到了一些新东西,以此记录。根据我的逐步学习过程,分了以下5个部分。

    1.由netstat查看网络情况,引出的TCP建立连接、终止连接过程,以及TCP状态分析;

    2.Soap=XML+HTTP引出的HTTP协议回顾;

    3.Soap(Simple Object Access Protocol)简单对象访问协议分析及应用;

    4.番外一:awk的使用

    5.番外二:Linux下抓包工具

    -----------------------------篇二----------------------------------------------

    一:HTTP协议几个要点

      参考文献:http://www.cnblogs.com/gpcuster/archive/2009/05/25/1488749.html

      HTTP协议,像pop3、smtp、ftp协议一样,都是应用层的一些通信规范,它运行在TCP之上,对通信数据格式、连接方式等做了一定的规范:

    1.Request和Response的格式

    Request格式:

    HTTP请求行(get还是post,协议版本)

    (请求)头(包括host、charset、connection等属性)

    空行

    消息体

     

    Response格式:

    HTTP应答行(协议版本、返回状态码:200还是404等)

    (应答)头(包括content-type、encoding、length等属性)

    空行

    消息体

     

      详细的信息请参考:RFC 2616

        HTTP headers的简要介绍,请查看:Quick reference to HTTP headers

    2.建立连接的方式

      从应用层看,HTTP协议是无连接的,不需要connect才传输数据,直接向服务器发送Request,然后服务器返回结果。

      HTTP支持2中建立连接的方式:非持久连接和持久连接(HTTP1.1默认的连接方式为持久连接)。是否持久连接,可以通过抓包看到,如果Request或者是Response的消息头中包含:Connection: Keep-Alive,表示持久连接;Connection: close表示非持久连接。

        非持久连接:

    举例说明:非持久连接情况下,客户端向服务器端请求一个web页面的过程:

    a.客户端初始化一个与服务器主机中http服务器的TCP连接;

    b.HTTP客户端经由与TCP相关联的本地套接字发出一个HTTP请求消息;

    c.HTTP服务器经由与TCP相关联的本地套接字接收这个请求,再经由一个套接字发出响应消息;

    d.HTTP服务器告知TCP关闭这个TCP连接;

    e.HTTP客户端经由一个套接字接收到这个响应消息,TCP连接随后终止;

    f.假设该响应消息中经分析封装的为一个html页面,其中包含10个jpeg对象的引用,则为每一个引用重复以上五步;

        持久连接:

    非持久连接的缺点:

    a.客户端需要为每个请求建立并维护一个新的TCP连接,对于每个TCP连接,客户端和服务器端都需要分配TCP缓冲区,并维持TCP变量;

    b.每个请求对象,都有2个RTT(Round-Trip Time)延迟,一个在建立TCP连接时发生,另一个在数据发送及应答时发生。(TCP连接建立的三次握手的前两次,是一个RTT,最后一次会与发送数据一起发送至对方服务器)。

    在持久连接情况下,服务器在发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。HTTP服务器在某个连接闲置一段特定时间后关闭它,而这段时间通常是可以配置的。持久连接分为不带流水线(without pipelining)和带流水线(with pipelining)两个版本。

        HTTP1.1协议中,默认使用持久连接,如果需要非持久连接,则需要在http头中设置connetion参数为:Connection: close

    3.缓存机制

    (略)

    4.响应授权激发机制

    (略)

  • 网络学习日志(一)---TCP的三次握手、四次握手及状态图

    2009-07-14 13:44:56

    由于有个项目涉及到TCP、HTTP、Soap的一些东西,于是回顾了一下以前曾经学过的东西,并学到了一些新东西,以此记录。根据我的逐步学习过程,分了以下5个部分。

    1.由netstat查看网络情况,引出的TCP建立连接、终止连接过程,以及TCP状态分析;

    2.Soap=XML+HTTP引出的HTTP协议分析;

    3.Soap(Simple Object Access Protocol)简单对象访问协议分析及应用;

    4.番外一:awk的使用

    5.番外二:Linux下抓包工具

    -----------------------------篇一-----------------------------------------------------

    引子:Linux上soap服务器在多并发、长时间运行后,客户端出现:connection reset by peer, broken pipe的错误。

    在网上搜了一些结果,基本上是说,如果浏览器向服务器发送一个请求后,在还没有收到返回结果时,点击了刷新、后退、停止、关闭等操作,在服务器端就会看到该错误。这是具体到了B/S结构的系统,如果通用一点讲的话,是指pipe(管道)读数据的一端没有在读,但是写数据的一端有线程在写,就会在写数据端看到该错误。

    以上问题目前还未解决。

    一:TCP建立连接

    文字描述:

    1.客户端首先向服务器端发送一个带有SYN(Synchronize)标记的TCP报文,向服务器申请打开某个端口;

    2.服务器接收到SYN后,返回一个ACK(ACKnowledge)确认收到SYN报文,并同时发送一个SYN报文(之前的SYN序号+1)向客户端确认(我已准备好数据发送,你呢?);

    3.客户端最后再返回一个ACK确认收到服务器端的信息,并做好数据发送的准备。

    至此,客户端、服务器均做好了数据发送准备,TCP连接的建立(三次握手)完成。

    图片描述:

    二:TCP连接关闭

    文字描述:

    由于TCP的连接是全双工的(可以同时发送和接受),因此在关闭连接时,也必须确认两端的连接均关闭。

    1.客户端向服务器端发送一个带有FIN段的报文,表示客户端已终止发送,客户端close;

    2.收到FIN后,服务器端返回一个ACK报文应答对方;

    3.服务器端发送一个FIN报文(之前的FIN序号+1),表示服务器端已终止发送,服务器端close;

    4.客户端收到FIN后,向对方发送一个ACK确认应答;

    至此,双方均已相互确认终止数据发送,TCP连接的关闭(四次握手)完成。

    图片描述:

    三:TCP状态图

    RFC 793: Transmission Control Protocol - Functional Specification
    http://www.rfc-editor.org/rfc/rfc793.txt
                                 
        
         +---------+ ---------\ active OPEN | CLOSED | \ ----------- +---------+<---------\ \ create TCB | ^ \ \ snd SYN passive OPEN | | CLOSE \ \ ------------ | | ---------- \ \ create TCB | | delete TCB \ \ V | \ \ +---------+ CLOSE | \ | LISTEN | ---------- | | +---------+ delete TCB | | rcv SYN | | SEND | | ----------- | | ------- | V +---------+ snd SYN,ACK / \ snd SYN +---------+ | |<----------------- ------------------>| | | SYN | rcv SYN | SYN | | RCVD |<-----------------------------------------------| SENT | | | snd ACK | | | |------------------ -------------------| | +---------+ rcv ACK of SYN \ / rcv SYN,ACK +---------+ | -------------- | | ----------- | x | | snd ACK | V V | CLOSE +---------+ | ------- | ESTAB | | snd FIN +---------+ | CLOSE | | rcv FIN V ------- | | ------- +---------+ snd FIN / \ snd ACK +---------+ | FIN |<----------------- ------------------>| CLOSE | | WAIT-1 |------------------ | WAIT | +---------+ rcv FIN \ +---------+ | rcv ACK of FIN ------- | CLOSE | | -------------- snd ACK | ------- | V x V snd FIN V +---------+ +---------+ +---------+ |FINWAIT-2| | CLOSING | | LAST-ACK| +---------+ +---------+ +---------+ | rcv ACK of FIN | rcv ACK of FIN | | rcv FIN -------------- | Timeout=2MSL -------------- | | ------- x V ------------ x V \ snd ACK +---------+delete TCB +---------+ ------------------------>|TIME WAIT|------------------>| CLOSED | +---------+ +---------+
                             TCP Connection State Diagram
                                   Figure 6.
    
Open Toolbar