OSI网络七层参考模型
这是7层网络参考模型 非实现层面的
TCP/IP协议实现
TCP/IP协议实现了七层网络模型 将展示层和会话层合并到了应用层 微信、QQ或tomcat进程都属于应用层 该层的常用协议http、https、ssh、ftp 程序员只需要关注这层就可以了 其他层次 比如传输控制层(TCP、UDP)、网络层(IP、路由协议)、链路层(ARP协议)是内核实现的 用户态通过系统调用切换到内核态
演示下网络交互过程
通过ssh登录linux操作系统执行命令exec 在没有任何浏览器或工具的情况下访问百度 取回百度主页 这一去一回过程牵扯到用户层、内核、tcp通信、http协议
exec 8<> /dev/tcp/www.baidu.com/80
/dev/tcp/www.baidu.com/80 这是一个路径 前缀是/dev/tcp linux操作系统一切皆文件 网络连接可以是一个文件 打印机可以是一个文件 以文件目录的方式来表示 内核最终会把它转换成socket
执行之后 在当前域中就有一个8了 这个8的输入输出指向和百度的这个socket连接 此时假设已经有了一个三次握手的socket连接了 那么要取回百度服务器的主页的时候 要给它发送什么才能取回来 牵涉到哪个协议 需要给百度发送一个http协议
GET / HTTP/1.0\n
/表示请求的资源 把这个字符串发送给百度 百度就知道了 你要请求主页了 协议就是规定了你发送的数据如何表示 HTTP协议就是数据如何表示HTTP协议
echo -e "GET / HTTP/1.0\n"
echo是打印 通过-e来识别换行符\n http协议是拿换行符做切割得到一行行字符串 每行字符串会用空格做切割 遇到2个换行符之后才是post body信息 8<> 表示将输入输出的2个方向都给到了百度
echo -e "GET / HTTP/1.0\n" 1>& 8
将输出重定向到了8 1>& 标准输出 8的输出又指向了sokcet 给百度了 百度如果接受到了 那么就会给返回 那么就需要读取该返回内容 socket网络通讯是双向的 有输出就有输入 给百度发送了http请求协议头 文本
cat 0<& 8
读取socket 8中流回的内容
读到了百度给返回的 HTTP/1.0 200 OK是响应头 接着是响应头的键值对 接着2个换行符 接着是响应体 内容就是百度的主页页面 取回东西之后就会断开连接
cd /proc/$$/fd
0是程序指向终端的标准输入 system.in 1是标准输入system.out 2是system.error 这3个是任何程序都有的 socket 也可以给出一个数字也可以是一个递增的数字 来代表这个socket fd文件描述符可以理解成一个变量 在java中 open一个文件得到一个file变量
lsof -p $$
本机随机端口号指向了百度的一个地址 80端口号 http协议 9 就是代表了对百度的一个socket socket怎么建立的? 实际上是由内核完成的
总结
连接不需要人管 连上之后 客户端和服务端之间的通讯 你说啥?牵扯到http协议 连的是web server服务器所以用的http协议 连的是ftp服务器连的是ftp协议 应用程序application里面会有协议封装的过程 这个协议封装不是内核做的 而是某种软件 比如浏览器、postman、http client 用户在使用浏览器的时候不需要关注协议的封装只需要告诉它访问什么就可以了