作为一个IT工作者,网络通讯的过程是必修课,这里我就把我的心得与大家分享一下;希望对一些工程师有帮助,在工作中能更深入的理解网络通讯,数据怎样通过网线传输;
现在很多文献都有对这方面的描述,但是很多人都看不懂,不理解;主要原因都是一些名词,不好理解;因为不是语音讲解,所以我就尽量使用大白话,让大家都理解到底是怎么回事;
首先,我们就来看下原始的网络模型;
应用层:其实这就是一个应用,一个软件比如QQ,注每个软件都有自己独立的端口用来标识
表示层:封装数据,比如QQ上发送图片,到了这一层进行数据封装
会话层:确定要与谁进行通话(发起会话请求IP/MAC/主机名)
传输层:用什么样的方式传输数据(TCP UDP)
网络层:要发送给哪个IP地址(路由器解封装IP地址)
数据链路层:IP地址对应的MAC地址,其实就是网卡,网卡地址全球唯一(交换机)
物理层:二进制数据如:0101110(比特流通过网线发送到另一台机器上的物理层进行解析数据)
如果你还是有点不理解,那不要慌:
网络参考模型能帮你解决问题,其实我更喜欢把网络模型理解为这个样子;
应用层 = 应用层+表示层+会话层
传输层
网际层 这一层负责指路,我要访问sina,baidu都是他在指路
主机至网络层 = 数据链路层+物理层
其实在物理层之前数据一直都在本机电脑上,直到完成二进制解析,才会变为比特流(电流强弱)发送出去,首先发送到域名解析器,先查找本地host文件中是否存在,然后发往最近的DNS解析器,找到DNS里面对应的域名,其实就是IP地址,从而锁定访问对象;
那有人又要问了我们是做web产品的,在网络传输过程中还要发送http请求,这又是怎么一回事呢?
其实浏览器就是一个软件,http请求:就是告诉服务端我要用超文件语言html进行沟通,你也用超文本语言来跟我进行对话;这个请求就在应用层,http里面还包括两种常见发送方式get和post有时间我会继续发文给大家讲解,这里就不啰嗦;那么我们就来看一下在输入网址后,我们到底向服务端发送了什么?
import java.io.*; import java.net.*; public class Server{ public static void main(String[]args)throws IOException{ ServerSocket ss = new ServerSocket(9966); Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip); InputStream in = s.getInputStream(); byte[]buf = new byte[1024]; int len = 0; len=in.read(buf); System.out.println(new String(buf,0,len)); PrintWriter pw =new PrintWriter(s.getOutputStream(),true); pw.println("<font color='red' size='7'>欢迎光临我的服务器</font>"); //pw.flush(); s.close(); } }
这是一个我用java写的简易服务端,能够接受浏览器发送的请求;同时进行一个反馈;如果不理解你可以把它看成一个中间件,例似tomcat;打开IE浏览器,输入http://loaclhost:9966/
192.168.1.2 GET / HTTP/1.1 Accept: text/html, application/xhtml+xml, */* Accept-Language: zh-CN User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Accept-Encoding: gzip, deflate Host: 192.168.1.2:9966 Connection: Keep-Alive
消息行 HTTP/1.1版本 get方式发送
消息头:Accept:能够接受的数据类型,*/*标识全部类型
Accept-Encoding:这是解压缩方式;网站资源比较大的时候,服务端会先把资源进行解压缩,然后再发送给你,提升效率;
还有就是浏览器版本,端口,IP地址,链接状态等;但是最主要的还是消息行中内容;
只要有了这些我们自己也可以写一个浏览器,把上述数据发送给服务端就可以了;只不过解析功能弱一点;
那么就很明显了在web传输的时候,发送了http协议,IP地址,端口号等;