网络通讯详解

作为一个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地址,端口号等;

原文地址:https://www.cnblogs.com/wangyinxu/p/6919729.html