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

网络模型

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是全双工的,因此每个方向上都必须单独进行关闭,因此是四次断开
  • 必须建立连接,效率会稍低
时间: 2024-10-14 14:37:57

网络编程学习笔记(一)网络模型及网络要素简介的相关文章

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.

linux网络编程学习笔记之六 -----I/O多路复用服务端

多进程和多线程的目的是在于最大限度地利用CPU资源,当某个进程不需要占用太多CPU资源,而是需要I/O资源时,可以采用I/O多路复用,基本思路是让内核把进程挂起,直到有I/O事件发生时,再把控制返回给程序.这种事件驱动模型的高效之处在于,省去了进程和线程上下文切换的开销.整个程序运行在单一的进程上下文中,所有的逻辑流共享整个进程的地址空间.缺点是,编码复杂,而且随着每个逻辑流并发粒度的减小,编码复杂度会继续上升. I/O多路复用典型应用场合(摘自UNP6.1) select的模型就是这样一个实现

linux网络编程学习笔记之五 -----并发机制与线程?

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.能够在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理须要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也非常easy,在主线程中定时,定

linux网络编程学习笔记之四 -----多线程并发服务端

相对于使用进程实现并发,用线程的实现更加轻量.每个线程都是独立的逻辑流.线程是CPU上独立调度运行的最小单位,而进程是资源分配的单位.当然这是在微内核的操作系统上说的,简言之这种操作系统的内核是只提供最基本的OS服务,更多参看点击打开链接 每个线程有它自己的线程上下文,包括一个唯一的线程ID(linux上实现为unsigned long),栈,栈指针,程序计数器.通用目的寄存器和条件码,还有自己的信号掩码和优先级.同一个进程里的线程共享这个进程的整个虚拟地址空间,包括可执行的程序文本.程序的全局

linux网络编程学习笔记之五 -----并发机制与线程池

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我只是举几个例子作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.可以在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理需要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也很简单,在主线程中定时,定时到期,

转 网络编程学习笔记一:Socket编程

网络编程学习笔记一:Socket编程 “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下:

.NET网络编程学习笔记

IPAddress类使用实例: IPAddress.Parse("192.168.0.1")  //将string类型的IP地址转换为IPAddress实例 IPAddress.Loopback   //获得本地环回IP地址,具体为 127.0.0.1 IPAddress.Broadcast  //获得广播IP地址地址,具体为 255.255.255.255 IPAddress.Any          //具体地址为0.0.0.0 ,Socket.Bind 方法使用 Any 字段指示

TCP/IP网络编程 学习笔记_4 --OSI七层网络模型

前言:本节将概括性的总结下网络通信的整体框架,其底层流程. 我们之前了解到了套接字的创建及应用,其实我们只是在用套接字这个工具而已,其底层细节对我们是屏蔽的.要通过因特网完成数据传输,其实不光光是软件就能解决的,还需要构建硬件系统等.因此,为了解决这一难题,许多专家聚集在一起,这些人是硬件,系统,路由算法等各领域的顶级专家.他们把网络通信划分很多模块,通过层次化的结构把大问题分成若干小问题逐个攻破.每个层都有一套定义好的通信标准(协议),数据就是这样通过这个层次结构从上到下,再从下到上传输的.示

VC++网络编程学习笔记

Visual C++网络编程是指用户使用MFC类库(微软基础类库)在VC编译器中,以实现网络应用.用户通过VC编程实现的网络软件可以在网络中不同的计算机之间互传文件,图像等信息.基础知识: 如果用户要进行VC网络编程,则必须首先了解计算机网络通信的基本框架和工作原理.在两台或多台计算机之间进行网络通信时,其通信的双方还必须遵循相同的通信原则好数据格式. 1.OSI七层网络模型OSI网络模型是一个开放式系统互联的参考模型. 发送信息的计算机 接收信息的计算机 7.应用层 7.应用层 表示计算机网络