Devin's Blog

Diversity is essential to happiness

0%

网络通信协议(3)

应用层

应用层
  由于互联网是开放的架构, 数据来源是五花八门.所以事先必须规定一些格式,否则根本没有办法解读.
  现在讲的应用层就是规定应用程序的数据格式.
  举个例子, TCP协议可以为各式各样的程序传递数据, 比如EMAIL,www,FTP等等, 那么必须有不同的协议规定电子邮件, 网页, FTP的数据格式.这些应用程序的协议就构成了一个应用层, 这就是我们说的五层协议里面最高的一层, 是面对用户的.

他的数据就放在TCP协议的data部分,所以以太网数据包就会变成以下的样子.

Ethernet head IP head TCP head –Application Layer data–


Imgur

   在这幅图中, 有4台主机.1和2处于一个子网,3和4处于同一子网.
    如果1给4发送数据包.然后4告诉1, 收到了数据包.这样就可以实现两台计算机之间的通讯.
    而发送这个数据包就必须需要两个地址. MAC地址和IP地址, 有了这两个地址之后, 数据包才能够准确的送到接受者的手中.
    但是MAC地址是有局限的, 如果两台主机不在同一子网, 就没有办法知道彼此的MAC地址.

   所以出现了网关(gateway), 它实现转发的功能. 主机1给主机4发送数据包.他先判断主机4是否处于同一子网.如果不是, 主机1把数据包发给他的网关(A).
    这网关通过路由协议, 发现了主机4处于另一个网关内(B). A网关把数据发送给了B网关, B网关又把数据转发给了主机4.

    主机1想要把数据发送给A网关, 需要知道A网关的MAC地址.
    所以数据包的目标地址实际上分为两种情况.

场景 数据包地址
目标主机同一子网 对方的MAC地址,对方的IP地址
目标主机非同一子网 网关的MAC地址,对方的IP地址

我们在windows中连接网络,可能会看到静态IP和动态IP的选项
Imgur

我们给电脑插上网线开机之后,不能立刻上网.我们必须要给电脑

  • 设置本机IP
  • 设置子网掩码
  • 设置网关的IP地址
  • 设置DNS的IP地址

静态IP
  首先它设置比较专业
  其次设置静态IP后这个IP不能被其他计算机使用处于这两点, 大部分用户都是使用动态IP地址上网.

动态IP
  所谓的动态IP就是指计算机开机以后会自动分配一个ip地址, 这个IP地址不会被别人设定.

动态IP使用的协议是DHCP协议

   这个协议规定了,在每一个子网中, 有一台计算机作为DHCP服务器.它专门去负责这个网络内的所有IP地址的自动分配.
    所有新的计算机加入这个网络之后,必须向DHCP服务器发送一个DHCP请求数据包.以此来申请IP地址和相关的网络参数.

    之前提到,两个主机在同一子网时,必须知道对方的MAC地址IP地址,才能发送数据包.

   
但是问题来了
新加入的主机不知道这两个地址.

DHCP协议做了一些比较巧妙的设定,首先它是应用层的协议,建立在UDP协议之上.
所以数据包是这样的

Ethernet head IP head UDP head DHCP data
    最前面的Ethernet head设置发出方,比如本机的MAC地和接受方DHCP服务器的MAC地址.

    发射方的MAC地址就是本机网卡的MAC地址,DHCP服务器的MAC地址是不知道的.

    这个时候就会填入广播的地址,有一个默认的6组16进制数组成. FF:FF:FF:FF:FF:FF

    后面的IP head 设置了发出方的IP地址和接受方的IP地址.对于两个主机而言,他们本机都不知道.于是发出方的IP设为0.0.0.0,接收方的IP设为255.255.255.255.

    最后的UDP head设置发出方的端口和接受方的端口.这部分是由DHCP协议规定好的,发出方是68端口,接受方式67端口.

    数据包构造完成之后就可以发送了.以太网是以广播发送的,在同一子网内的每一台主机都会收到这个包.因为接收方的地址是FF:FF:FF:FF:FF:FF所以看不出来是发给谁的.收到这个包的主机会分析这个包的IP地址,确定是不是发给自己的.之前讲ARP协议的时候,已经有接触.

    当看到发出方的IP地址是0.0.0.0,接收方IP地址是255.255.255.255.于是DHCP服务器就知道这个包是发给我的.其他主机就会丢弃这个包.

    接下来DHCP服务器会读出这个包的数据内容,然后分配好一个IP地址,发送回去一个DHCP响应数据包.

    DHCP响应数据包.它的格式和DHCP数据包类似.分配给请求方的IP地址和其他网络参数都会包含在data这部分.新加入的主机就知道了自己的IP地址,子网掩码,网关地址. 有了这个之后就可以上网冲浪了.

下面举一个实例
#当访问一个网页的时候,互联网协议是怎么运作的?
在浏览器地址栏输入google.com
意味着浏览器要向google服务器发送一个请求的数据包.当从本地请求一个网络地址的时候.

   DNS协议就能够实现这样的功能,他可以将网址转换成IP地址
   假设DNS服务器是8.8.8.8,于是向这个地址发送一个DNS数据包,使用53的端口.而DNS数据包的格式是这样的.

Ethernet head IP head UDP head DNS data
   我们发送这个数据包之后,DNS数据包会做出一个响应,他会告诉主机Google的IP地址.

  • 知道IP地址之后,就需要判断是否和本地处于同一个子网,就需要用到子网掩码.主机对本地的IP地址和从DNS服务器获取的IP地址进行二进制AND运算.由此判断是否在同一网络.

   因为不处于同一个子网,所以要向Google发送数据包就必须要经过网关(gateway).也就是路由器192.168.1.1. 进行转发.
接收方的MAC地址是网关的MAC地址.

  • 而浏览网页使用的是http协议,它的数据包结构是
    Ethernet head IP head TCP head http data
    假设http请求数据包的长度是4960字节,它会被嵌在TCP的数据包当中.

   TCP协议
   TCP的数据包需要设置一个端口,接收方(也就是google),他们的默认的http端口是80.
   而发送方,也就是本机.它的端口是随机生成的1024-65535之间的整数.假设是12345.

   TCP协议的标头(head)是20字节,加上嵌入http的数据包,总长度是4980字节.

  • 再往下走是IP协议,这是已知的,发送方是我本机,接受方IP地址是DNS响应包的里的地址.

   IP数据包的标头(head)是20字节,加上嵌入的TCP数据包,总长度是5000字节.

   最后IP数据包嵌入以太网数据包,以太网数据包需要设置双方的MAC地址,发送方是本机的网卡MAC地址,接受方是网关的MAC地址.他通过ARP协议可以得到.

   以太网的数据部分最大长度是1500字节,现在IP数据包的长度是5000字节,所以这个IP数据包要被分割成4个包.
因为每一个包都有自己的IP标头(head).他们是20个字节.

以太网包头 ip包头 tcp 数据
Ethernet head IP head TCP data_1(1500字节)
Ethernet head IP head TCP data_2(1500字节)
Ethernet head IP head TCP data_3(1500字节)
Ethernet head IP head TCP data_4(560字节)

   这就是http的请求德过程,请求结束之后.服务端会给本机响应.传回HTML网页.浏览器将他渲染出来.

   这个过程进过多个网关的转发.Google的服务器收到了四个数据包之后,根据IP标题的序号.把四个数据包拼起来,取出一个完整的TCP数据包.
   然后去读取Http请求,接着做一个http响应.最后再用TCP协议发回来.
   本机收到这个响应之后,我们就能看到这个网页,也就完成一次网络通讯.