概述:
第一:
①网口:最主要是的是8个引脚分别对应着网线中的8根(其中4根用来传输电信号,4根用来增强信号强度)
备注:我们所有接收的网络信息全是以电压的高低变化来进行传输(比如高电压则为1,低电压为0,在计算机芯片领域中高电压一般为3.7v,低电压0v)
②ip:在路由器和计算机以及Windows/linux系统再制造的时候就约定好了一组交互的模式,学术上叫做协议
协议的本质是什么呢,就是一串又一串0和1
附注:路由器和计算机芯片内嵌入的开发语言都是高级编程语言,又是怎么去存储和处理0和1的呢,如果单纯的一个bit一个bit的存储 必定是不好维护的,聪明的人类以int/double等类型将连续的几个0和1组合表示,那么计算机又是如何在操纵系统中存储ip地址的呢,比如:192.168.1.100这个IP4地址 大家都知道ip4地址都是32位(4个字节)也就是32个0和1 ,你会发现int类型刚好是4个字节,所以计算机系统内核存储ip地址就是一个int类型 ,那么为啥我们看到的是192.168.*.*这种形式呢,那是因为c语言里进行了处理。
③讲了ip地址 那么路由器是怎么跟计算机系统通信的呢?这就用到了协议也就是上图arp/rarp协议
一个协议会有协议头 协议报文 等一系列的数据,显然如此庞大的协议是不可能用一个int或者其他什么基本类型存储的,也许会用到多个类型,那么那么多类型来存储一个协议 必定就会在内核的存储里变的混乱不甘,那么我们的操作系统又是如何处理这个呢,这个就用到了结构体的概念,事实上在windows的内核里都是以结构体的形式存储着所有的信息
④当有了ip后,我们就可以通过ip来定位到具体的一个计算机从而让这台计算机做一些我们想他做的事情,那么我们怎么通知这台计算机做一些事情?这个就是协议(广泛的协议并非是指我们熟悉的tcp这种,而是我们都可以自己编制的协议,比如tcp/udp协议就是网络通信协议)
⑤有了协议后我们就做到了跟计算机通信,假象一下,我想计算机做事,但不只做一件事,我们可能会想每做一个事情就生成一个协议,这个是可以解决问题的但却是不合适的,所以端口这个概念就出来了,什么叫端口了,端口就是计算机系统虚拟出来的一个东西,用来区分同一个协议下不同的功能就用不同的端口来呈现,那么有个问题为啥我们常常操作系统里端口是不能复用的,那时因为操作系统是使用指针指向端口,如果复用就会导致大多数指针都指向同一个内存区域,如有不慎系统就会崩溃。
⑥有了ip我们可以定位计算机,有了协议我们可以通信,有个端口我们可以让计算机干很多我们想他干的事
以下以tcp协议为例:
假象一下我们打开浏览器输入域名时会发生什么?
域名的本质就是ip地址,域名为啥就会对应ip地址了,这也是协议服务(dns)约定熟成的
但是这个我们还没有看到端口 ,端口在哪里呢,其实每一个看不到的端口都是默认端口80端口 https协议是443
也就是以上访问实际是访问juyan.yuque.com:443/
题外:我们经常用的apache/nginx等web服务器 也是基于此原理上开发而来(所先调用WindowsAPI接口函数打开一个端口,并接收数据),如果我们想要自己写一个http服务器怎么写呢,一样的调用接口打开一个端口并接收从这个端口进行来的数据(俗称 socket网络编程),拿到进来的数据 按照协议规定的内容选中我们需要的东西(比如url以及附带的get/post参数),根据拿到的东西通过反射和动态代理的方法去执行我们的功能
⑦现在我们要开始写一个web服务器了
第一步:在本地计算机打开一端口并接收从这个端口进来的数据
第二步:当我们拿到数据后 处理数据(如上图每来一个新的socket就会开启一个新线程去处理)
(网络上的数据都是以流的形式传输的 你把拿到的数据当成字符串进行处理即可)
比如请求:www.ltm.com:10833/dorequest发送… 就是往我写好的代码里发送数据,代码中的server.accpet就会停止阻塞继续往下执行代码
我们就会拿到发送给我们的数据,发送给我们的数据我们看上去像是一个字符串,实际上就是协议内容,只不过操作系统已经对齐进行了封装,我们到了字符串根据正则配置出上面的那个url :www.ltm.com:10833/dorequest
接下来 我们该怎么做呢,我们先要筛选出dorequest,然后去调用我们写好的dorequest方法
以上就是个简单的web服务器的构成。
那么问题来了,传说中的http代理又是什么东西
http代理其实就是一个web服务器,只不过这太服务器不需要你去根据url筛选调用自己的方法,只需要 你拿到人家访问的url,然后像这个url发送正常的请求把拿到的数据原封不动的在返回给你自己的客户端,如此一个http代理已经完成。