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响应消息的格式拼接好数据然后返回给客户端。返回的过程和请求的

       过程是一样的。

     

         

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值