首页 > 代码库 > 网络编程学习笔记(一)网络模型及网络要素简介

网络编程学习笔记(一)网络模型及网络要素简介

网络模型

OSI参考模型

OSI(Open System Interconnection,开放系统互联)参考模型,由上至下:

应用层:主要是一些终端的应用,完成对数据的解析,比如FTP(各种文件的下载)、WEB(IE浏览器)与QQ之类的终端应用,浏览器是中超强解析器,但是例如发送一个QQ消息,对应只能使用QQ对其进行解析。

表示层:主要对接受的数据进行解释,加密与解密,压缩与解压缩(也就是把计算机能够识别的东西转换成人能够识别的东西,例如声音、图片等)。

会话层:通过传输层(端口号:传输端口和接收端口)建立数据传输的通路。主要在系统之间发起会话或者接受会话请求(设备之间相互认识可以是IP,MAC地址或者主机名)。

传输层:定义传输数据的协议和端口号,即按照什么样的规则将数据发送出去,如TCP,UDP。主要将从下层接收到的数据进行分段和传输,到达目的地址后再进行重组,通常把这一层的数据叫作段。

网络层:主要将从下层收到的数据进行IP地址(例192.168.0.1)的封装与解封装,在这一层工作的是路由器,往往决定数据要发向哪一台主机,常把这一层的数据叫作数据包。

数据链路层:主要从物理层接受数据,对其进行MAC地址(网卡的地址(可以配置IP地址,例如192.1.1.100)也可以配置物理地址,可以理解为一个编号,出厂时便携带,唯一,即网卡可以变换IP地址,但是无法变换MAC地址)的封装与解封装。常把这一层的数据称为帧,在这一层工作的设备是交换机,数据通过交换机来传输。

物理层:定义物理设备标准,如网线接口类型,光纤的接口类型,它的主要作用是传输比特流(即数模转换和模数转换),这一层的数据叫作比特。

demo:
发送一个数据,由A到B,在A的应用层时,其会给数据封装一个标记,例如这个数据是通过QQ发送,会封装一个QQ的壳;到达表示层解释,例如发现是图片数据;在会话层,要与谁进行传输,建立一个会话,会再封装一层信息;通过什么样的方式传输数据,例如TCP,在传输层封装这个信息;发给哪一个IP地址,网络层;数据链路层:对应哪个MAC地址,即交换机会去执行;物理层:变成01码进行传输。

发送中各种的作用:对数据进行封装并加上标识。

接收端B:实际上可以看作是发送的一个逆过程,相当于一层层的拆包

技术分享

TCP/IP参考模型

TCP/IP参考模型是四层结构:

应用层(相当于OSI模型中的应用层、表示层、会话层)

传输层

网际层

主机至网络层(OSI模型中的数据链路层与物理层)

技术分享

网络要素-IP地址

IP地址:InetAddress(存在于网际层)

  • 网络中设备的标识
  • 不易记忆,可以使用主机名
  • 本地回环地址:127.0.0.1(每台机器都有,只为用来访问本机用) 主机名:localhost

在java.net包下
直接已知子类:Inet4Address(IPV4)与Inet6Address(IPV6)

如下是一个InetAddress的一个demo:

import java.net.InetAddress;
import java.net.UnknownHostException;

public class IPDemo {
    public static void main(String[] args) throws UnknownHostException {
        //获取本地主机ip地址对象
        InetAddress ip = InetAddress.getLocalHost();//会抛出异常
        System.out.println(ip.getHostAddress());//获取主机地址
        System.out.println(ip.getHostName());//获取主机名

        //获取其他主机的ip地址对象
        ip = InetAddress.getByName("192.168.1.100");
        System.out.println(ip.getHostAddress());//获取主机地址
        /*
        此步运行可回慢,因为解析时会对应搜索映射列表,如果不存在即解析不出来,无法获得name
         */
        System.out.println(ip.getHostName());//获取主机名


        //获取百度ip地址对象
        ip = InetAddress.getByName("www.baidu.com");
        System.out.println(ip.getHostAddress());//获取主机地址
        System.out.println(ip.getHostName());//获取主机名


    }
}

结果:

技术分享

对于一些结果的原因可以通过如下域名解析来进行加深理解。

域名解析

假设主机有一个IP地址是10.1.1.1,主机里存放sina的网页资源

技术分享

进行访问正常应该http://10.1.1.1进行访问,访问其他主机必须通过IP进行访问,由于互联网上主机非常多,IP地址也非常多,很难记忆。通过给主机“起名字”的方式:
www.sina.com.cn:www主机名称,sina域名(sina域中有www主机,同理sports.sina.com.cn,sina中的sports主机),com表示表示所属组织,表示商业组织,盈利为主,org表示非盈利,cn表示所属国家

为什么通过http://www.sina.com.cn可以访问到sina主机?
IP与名字是具有对应关系的,在互联网上有很多台公共服务器,上面存储着这些IP地址与名字的对应关系的列表,因此先通过DNS(域名解析服务器)对sina进行域名解析找到IP地址。使用什么DNS服务器解析无所谓,只要DNS中有目标的映射列表即可,不过为了效率一般使用“就近的”DNS。

在本机里填加域名解析列表配置:在C:\Windows\System32\drivers\etc\hosts文件中加入配置即可,例如

127.0.0.1 localhost
192.168.1.100 www.megustas.com

因此在解析192.168.1.100 时

ip = InetAddress.getByName(“192.168.1.100”);
System.out.println(ip.getHostName());

得到的是www.megustas.com

域名解析时最先使用的是本地的配置文件,解析失败时再使用互联网中的DNS

那么如何使局域网中的机器都可以访问www.megustas.com?
可以在局域网某一台电脑内安装一个DNS服务软件,把需要的对应映射配置进行,在其他机器进行访问需要做的操作就是在首选DNS服务器配置的地方配置下DNS即可

屏蔽一些网站,使一些网站打不开,比如不想登陆www.game18.com这样一个网站,可以在本地映射列表中添加如下映射:

127.0.0.1 www.game18.com

这样当进行域名解析时会率先使用本地DNS解析,而不使用互联网中的DNS,例如360屏蔽恶意网址也是使用如上原理。

技术分享

网络要素-端口

假设使用QQ要向192.168.1.1的主机发送数据,数据到达192.168.1.1时,如何判断用主机中的哪个应用程序进行解析,也就是说如何进行这些应用程序的标识区分?

通过端口就可以实现如上的需求,通过(逻辑)端口来给程序分配标识

技术分享

端口号:

  • 用于标识进程的逻辑地址,不同进程有不同的标识标识
  • 有效端口:0-65535,其中0-1024系统使用或保留端口,系统一些服务使用这些端口。

例如通过360可以看到各个程序所在使用的端口:

技术分享

防火墙通过禁用端口就可以实现禁用某个程序。

网络要素-传输协议

协议即规则,传输协议就是指进行传输的两端按照什么样的方式进行数据的传递。

常见协议:TCP与UDP

UDP

  • 将数据及源和目的封装在数据包中,然后将数据包发送出去,不需要建立连接(跟去邮局发快递一样,将发的东西放在包裹里,外面贴上地址),因此地址可能是无效地址,但是并不影响,其依旧会封装之后发送出去,因此不需要建立连接
  • 每个数据包的大小限制在64k内(数据大时,分成多个包发送)
  • 缺点:因为没有连接,是不可靠协议(因为目的地址可能是无效的)
  • 优点:速度快
  • 例子:对讲机就是使用UDP,当一方使用时进行对讲(并不知道对方是否在),如果对方在,使用对讲机将会收到信息,如果不在使用,将收不到信息。QQ视频聊天也是UDP。

TCP

  • 必须建立连接,形成传输数据的通道(即对方必须在,才进行数据传输)
  • 在连接中进行大量数据传输
  • 通过三次握手完成连接,是可靠协议(不会出现丢包的情况)
  • 由于TCP是全双工的,因此每个方向上都必须单独进行关闭,因此是四次断开
  • 必须建立连接,效率会稍低
<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    网络编程学习笔记(一)网络模型及网络要素简介