热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iso7层模型

       计算机网络的东西要学可以学好几个月,要讲这也是大学一个学期讲不完的。所以我只挑和咱们开发息息相关的先讲,有时间再去深入学习其他一些网络知识。      这次主要

        计算机网络的东西要学可以学好几个月,要讲这也是大学一个学期讲不完的。所以我只挑和咱们开发息息相关的先讲,有时间再去深入学习其他一些网络知识。

        这次主要讲计算机网络iso7层模型,http协议详解,tcp套接字的使用,tcp协议详解

         iso模型

         第一部分我们开发控制的范畴:应用层,表示层,会话层

         第二部分处在所有开发者统一的范畴:运输层,网络层,链路层,物理层

        为什么这么分,第一部分是暴露给我们开发者的,规则可以我们自己制定。第二部分通常是不暴露给我们开发者,就像运输层的tcp协议,ip协议格式对于我们来说不通过专门的工具是看不到格式的。而通常我们也不需要知道tcp,ip的格式,我们只需要知道运输层封装了应用层消息。如下图:

       

         1:应用层

          顾名思义:以笔记本举例,就是针对笔记本上的应用的,如邮件,web浏览器等都是所谓的应用。而应用层就是直接就是对这些应用提供服务的,提供服务的方式主要是通过各种协议。以web浏览器为例,http协议就是一种能为web浏览器服务的协议。

       GET /data=121 HTTP/1.1
       Host: localhost:6789
       User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0
       Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
       Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
       Accept-Encoding: gzip, deflate
       COOKIE: Hm_lvt_042f1b4fd18a22ee217f0673c4c1b92f=1490251794
       Connection: keep-alive
       Upgrade-Insecure-Requests: 1

      也就是说我们不通过浏览器,自己拼接一个这种格式的数据发给服务器,它也是一个http请求。只要符合http请求格式的数据都是http请求。而web开发当中,将这个请求封装成了HttpServletRequest。我们处理request的过程其实和手动解析这个消息,再处理是一样的,只不过处理request明显更加方便。

     以上的信息中COOKIE是用来做缓存的,这边的connection:keep-alive是什么意思?

    举个例子你要请求一个html页面,这个页面上有10张图片,如果你选择close,那么你需要建立11次tcp连接。而如果是keep-alive,你只需要建立一次tcp连接。默认的请求方式都是keep-alive。

    咱们再看一眼,http响应,如下:

   

  响应会告诉我们请求的资源的server。

 http响应消息通常有以下的情况:

 200 信息包含在响应报文中
 301 请求的对象被转移 将访问新的url去获取对象
 400 该请求不能被服务器理解
 404 被请求的文档不在服务器上
 505 不支持http协议版本

      2 :表示层

        应用层产生的消息,并不会直接发送出去,会在表示层进行加密,压缩,并且制定加密的方式,压缩的方式等等。直观地说就是对数据加了一层包装。同样的接收消息就是在这一层,解压,解密。

      3:会话层

        总结就是会话交谈,是负责管理进程之间的会话。其实表示层,会话层,应用层都是是应用层抽象出来的,我们没有必要在这一层深究会话层做了什么,表示层做了什么。这个不是这次的重点。

      表示层和会话层是在应用层上进行更详细的抽象,比如按照http格式拼接的报文你需要进行加密,那么对应用层进行加密的操作就是表示层的事。然后会话层,在表示层可以记录客户的状态,以维持一个连接。这些都是在代码中可以控制的,我们并不需要强制地给应用层分层,这个意义并不大。

      4:传输层

        传输层提供的是端到端的协议,还有差错控制。非常重要的就是tcp和udp2个传输层协议。

        tcp:可靠的三次握手的连接

        udp:不可靠的连接

        观察下图:

      

        为什么需要三次握手?

        我们假设只有2次握手,会发生什么。a向b请求建立连接,b同意。如果有一个请求连接的报文因为网络问题延时了,而此时客户端并没有想要连接,可是服务器还是与之建立连接,并且预留资源。这种是很浪费资源的,为了杜绝这种情况,tcp采用三次握手。

      四次挥手

    

   为什么需要四次挥手?

   因为fin报文仅仅是告诉对方,我接下来不会发送信息了。只有当a,b都处于自己不发送信息,对方也不发送信息的情况下才会关闭连接。

   接下来讲一个很有趣的东西,tcp是如何控制信息的可靠的,即tcp的防止丢包的算法:目前用的是选择重传。在讲这个算法之前首先要知道tcp协议的格式,如图:

 

挑重要的点讲一下:

源端口号,目的端口号不解释。

序列号,确认号,参数是用在控制丢包上的参数。

校验和是用于检验数据是否有效的。

填充是为了保证tcp头是32的整数倍,没有深入了解

数据就是应用层的数据。

接下来将tcp是如何保证可靠数据传输的。

1 我们考虑网络层是可靠的传输,那么tcp没有必要做任何动作。a,b正常交互

2 考虑网络层数据可能会出错

    引入ACK,NAK

   A向B发送tcp报文,B正确收到报文,回复ACK,发送下一个TCP报文

    错误收到回复NAK,A重新发送这个TCP报文,这个有没有什么问题?

  没有考虑到ACK,NAK受损

3 考虑到ACK,NAK受损,引入序列号

  首先,如果没有收到ACK,就重新发送这个报文,然后序列号和之前的序列号相同。即用1/0标识这个分组是不是重传,如果接收方发现这是个重传。那么不接收这个消息体,直接返回ACK。这样就解决了确认是否重传的问题。这个有什么问题,没有考虑丢包。

4 引入定时器,一定时间没有收到tcp报文就重新发送报文。

 考虑这个有什么问题?

 这个效率实在太低了,发送一个报文的代价太大。

5 发送一个报文的时候,在整个报文的传输,差错校验当中,所有的其他报文都要等待。所以引入一种算法:回退N步

 我一次性发送很多个报文,不要一个一个发。

  发送方:从数据结构的思想来考虑就是有一个长度为N的队列,队列中放着待确认的报文的序号。

 接收方:收到序号n的时候,回复ACK+n,等待n+1,如果收到n+2,回复NAK+(n+1)。继续等待n+1

 发送方收到NAK+(n+1)会送n+1开始重发n+1之后的所有tcp报文。

 队列的作用是为了防止发送方一直发送,假设发送方一直发送,当出现一个tcp报文错误。会导致网络中出现大量的无用报文,举个例子,发送方发送了1到1000序号的

tcp报文,而1就错了。那么2到1000的报文都没有用了,这是很不合理的。队列的作用是控制发送的报文的数量,举个例子队列长度为100.如果发送方发送了1到100的

序号的报文,而此时一个ACK都没收到,那么发送方将停止发送报文。因为此时队列的长度是100,当收到ACK+1的时候,队列中少了一个待确认报文。报文101发送,

待确认报文多了一个101.因为序列不能无限大,所以这个序号会有一个轮回。那么此时会出现什么问题?

举个例子队列长度为8,而序号长度为4.你会不知道ACK+4是第一个4还是第二个4,所以队列的长度不能大于序号的长度。

那么这个方法还存在什么问题?

6 因为一个数据的差错会造成大量的有效数据的重传,所以这个方式还是不好。最后引入选择重传,即当出现有错误的序号tcp时,不要全部重传,而是选择性的重传。

  选择重传是现在计算机网络用来控制丢包,差错的算法。下面着重介绍选择重传。

 这个我们自己可以实现以下,如何实现一个算法来解决这个问题。简单的说1收到,2 丢失,不该继续等待2而是接受3,当发送方发现2丢包。就再发送

 2,等到2在接收方被确认的时候,可能2,3,4,5,6,都确认了,那么这6个再一起发送。就是让3,4,5,6都等2.这样也不能无限等,当发现等待的队列已经等于N的时候就会

 不存储任何数据而只等待2了。准确的说是选择重传在接收方也放了一个队列。这时候接收方的窗口,发送方的窗口多了一个新的限制就是,窗口长度必须小于序号大小

 的一半。为什么?

这也是为了防止重传和新的tcp报文的问题。

接下来讲一下tcp的拥塞控制机制

为了保证网络上的道路不至于过度拥塞,tcp有自己的一个拥塞控制机制。这个不详细介绍,我也没有了解。

      5:网络层

    

     观察图片简单的说主要就是加上一个源地址,目的地址。接着将数据放到链路层,注意这里的数据部分就是我们传输层上来的数据。这里涉及到DNS,这里的ip其实是

    域名解析之后得到的ip,DNS是一种应用层协议,也就是说浏览器调用了另一个应用,通过DNS协议获得了ip地址,然后包装在了数据上。这一层的数据叫数据包。

    6:链路层

   

          观察上图可以知道,我们需要包装物理地址,而物理地址我们怎么知道,这里就要用到ARP协议,根据ip地址查找物理地址。然后这里额外说一点,数据在链路层叫帧。

         数据封装完了之后到了物理层。这里就要涉及到一个很有意思的过程,我讲的是其中一种方案,我们的电脑通过路由器其实仅仅知道附近的ip,我们会问它你知不知道

         ip地址为xxx的物理地址,他们如果知道就会告诉你。得到mac地址之后,就会根据一种算法直接去找这个mac地址。很显然你找的时候走的道路就是物理层。

    7:物理层

        传输数据的媒介,这一层数据叫比特。数据通过光纤等介质,传输到了网络道路中,交换机会扒开数据。然后因特网是tcp/ip寻址,也就是说数据在传输的时候是通过

       ip地址来寻找终点的。通过物理层找到mac地址后,直接打开这个数据包到传输层,找到这台机器的对应端口,然后会话层做一些同步,到了表示层解压解密。再把

       这个信息直接给应用。

       以http协议为例,这里讲一下http响应信息,因为应用层知道这是一个http请求,所以会按照http响应消息的格式拼接好数据然后返回给客户端。返回的过程和请求的

       过程是一样的。

     

         


推荐阅读
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 渗透测试基础bypass绕过阻挡我们的WAF(下)
    渗透测试基础-bypass ... [详细]
author-avatar
鄢都浪子_562
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有