网络通信

网络通信

前后端数据交互:同源策略请求ajax & fetch;跨域策略请求:jsonp & cors domain;

客户端:发请求的

服务器端:接收请求的。在电脑上建立服务站点,那么你的电脑就是服务器。

URL地址解析:浏览器解析地址,包含特殊符号的处理 =》

DNS域名解析(解析到哪个服务器),帮你找到你应该连接到哪台服务器 =》

建立tcp连接 =》

连接建立起来之后,HTTP来回传输 =》

  1. URL地址解析

URL和URN是URI的子集。URI,一般泛指URL,URN不常用。

浏览器把完整的URL分成一部分一部分,从而得到我应该基于哪部分该怎么走,这就是URL解析的过程。

URL组成:

-协议

客户端想把信息传给服务器是基于HTTP传输的,服务器想把内容返回给客户端也是基于HTTP传输回来。

+http。超文本传输协议。除了文本还有音视频这些。文件流、二进制编码流、音视频流和xml文档流。比如图片,经常是编译成编码,把编码传输给服务器,服务器接收编码解析成真正的图片,使传输更加快速。

+https。更安全,ssl。通过https传输的都要经过ssl加密。

+ftp。文件大,文件比文本大。把文件上传到服务器就要用到ftp。

服务器:性能配置好的电脑。4g内存=>16g内存,1个cpu=>8个cpu。

-域名

让用户方便记忆

顶级域名 qq.com

一级域名 www.qq.com 点前面是www的就是一级域名

二级域名 sports.qq.com

三级域名 v.sports.qq.com

服务器会有2个ip:外网ip和内网ip

-端口号。默认80

取值范围:0-65535

区分同一台服务器上的不同的项目。

服务器拿到端口号去查找项目。

-请求资源路径

首先通过端口号找到对应的项目,要请求的资源文件路径名称。

不指定会有一个默认的。

存在URL重定向的情况。是为了seo的优化。

-问号传参

其实就是query,目的就是为了传输信息——通信。

-hash值

URL编码

因为事实上,能够直接用于URL的字符是非常有限的。其他字符都需要经过编码才能放到url里面。

"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."
"只有字母和数字[0-9a-zA-Z]、一些特殊符号"$-_.+!*'(),"[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。"因此对于Url而言,只有普通英文字符和数字,特殊字符$-_.+!*'()还有保留字符,才能出现在未经编码的Url之中。其他字符均需要经过编码之后才能出现在Url中。
  1. 使用基于encodeURI进行编码

浏览器地址栏会默认做的事情

lis珠峰培训
https://www.zhufengpeixun.cn/stu%20list%E7%8F%A0%E5%B3%B0%E5%9F%B9%E8%AE%AD

为什么要进行URL编码 - 降瑞雪 - 博客园

关于URL编码 - 阮一峰的网络日志

HTML URL 编码参考手册 | 菜鸟教程

  1. 如果链接中又出现了http,那么使用encodeURIcomponent

ecodeURI是处理特殊字符的,如上述1;

但是又出现了http这些,需要使用encodeURIcomponent;能编码的符号更多;

为什么要进行编码?

不编码会无法识别,会乱码。浏览器自己会编码。

  1. DNS域名解析

添加 域名《=》服务器外网IP 的记录

结果:通过域名到dns服务器上找到服务器的外网IP

性能优化之DNS缓存

dns预处理,缓存时间1分钟左右

  1. 在dns服务器上找

  2. 在本地dns缓存中找

预获取:所有跟当前网站主域名不一样的其他域名,都要做预获取。

  1. TCP三次握手

tcp

找到外网ip,让客户端和服务器端建立关联,建立tcp连接;

tcp:传输协议,建立网络连接即建立tcp连接;

http:建立连接之后内容的传输就用http/https

tcp握手三次

通俗的讲法:

  1. 客户端发起,我要发请求了;

  2. 服务器发起,我知道了,你发请求吧;

  3. 客户端发起,好的我要发了。

网络通信机制中去发信号,然后服务器接收信号给予回馈,

第一次,客户端向服务器传点东西,传SYN的标识,SYN=1;seq标识值为a,自拟;

第二次,服务器会把之前的SYN返回,然后会多一个ACK,ack的值就是之前seq+SYN,但是同时我又返回了seq=b;好比是,上一次你给我传了一个1和一个a,那我返回1+a给你,并同时返回了一个b;

第三次,返回1+b;

用代码的方式告诉我一切ok。

只有3次才确保连接成功,才确保通信没有任何问题。我真正发请求之前先发点东西试试看有没有通。

1传输速率高;seq传一个标识,浏览器建立起来。

http报文

把客户端要传给服务器的信息通过http协议传输过去,在建立好的tcp连接通道中传输过去

http报文:

请求报文:xxx

相应报文:xxx

在network看到所有客户端和服务器端通信的内容

request URL:http://xxx

method:

get系列:get head delete;

post系列:post put;

status code:304协商缓存;

response header:

connection:keep-alive tcp协议的长链接,保持tcp连接不中断;

date:服务器返回的时间

etag:304弱缓存

request header:

accept-encoding:允许的编码和压缩方式

cache-control:强缓存

cookie:xxx

if-modified-since:刚开始建立缓存的时间

user-agent:所使用的的浏览器的版本信息

都通过请求头传给服务器

connection:keep-alive 保持tcp的长连接

  1. 构建web服务器

  1. 资源上传到服务器 ftp

  2. 构建web服务器

  1. 指定项目路径,项目路径是非常重要的

  2. 指定端口号,端口号很重要

!!!注意

服务器上什么都不安的。输入法都不安。因为服务器要保证的是绝对安全和端口不被占用。

比如上线后报错。如果已经定位到哪里的问题,直接到服务器上去改。

web服务器:负责接收客户端请求,查找相对应的资源文件,最后返回给客户端的

一台服务器最多可创建65536个服务:0-65535;

首先通过域名找到服务器,找到服务器就能找到你的某个服务;

服务器知识

web服务器:

静态资源服务器:资源文件的请求 /html/css/js

图片服务器:因为图片资源的请求一定是浪费时间的,处理图片时间一般比页面时间要长。web服务器拆成静态资源服务器和图片服务器。

视频服务器:视频流的处理,把音频、视频做成流,客户端发请求都走的流文件。比如,记者直播录像随时把这些信息传到服务器上,服务器将其转换成流文件,客户端向服务器发请求的时候会建立视频流的长链接,随时向客户端推送视频流。直播录像->服务器->客户端页面。

数据服务器:

首先!和web服务器的区别:

客户端向web服务器发请求时,找到资源文件并返回,这个是不需要代码的,工具实现;

但是数据服务器不同,接收到请求,要执行相关的程序处理你的请求,这些程序是拿代码来写的;然后从数据库中读取你所需要的数据;把数据进行二次解析重构;把数据返回给客户端;这是后台开发工程师要干的活

  1. web服务器和数据服务器一起,同源策略;用的是同一台服务器,同一个域名,同一个端口;=》ajax

  2. 如果是分2个服务器来做,不在一起,当前向服务器发请求,那就有好多个服务器,那每向一个服务器发请求,都得dns解析,所以性能优化dns预处理;

http状态码

能正常返回和不能正常返回

状态码:

1-5开头,三位数字,

------------------------------------------------------

1xx 处理中,见不到。忽略掉这部分。

------------------------------------------------------

2xx:

200 成功。

201 我向服务器发一个请求,我叫他你给我创建一个文件,服务器创建好了返回了201。

204 No Content。put/post/delete,我没处理这个请求。服务器拒绝对这个请求进行处理。

---------------------------------------------------------

3xx

301 永久重定向。服务器告诉你,我不处理了,交给另外一台服务器去处理。京东之前的域名叫360by,现在叫jd。所以你请求360buy它会去做永久重定向。一般用于服务器迁移、域名迁移。

302 临时转移。主要用于服务器的负载均衡。现在转移了,下次一定转移么不一定。高峰期的时候临时转移到其他服务器帮我处理,这就叫服务器集群。

第一台最多能支持100个并发,那101个就转移到第二台;第二台满了就转移到第三台;……

304 协商缓存。第一次向服务器发请求,建立缓存机制;第二次客户端从缓存中去拿,而不是从服务器去拿的。减少了了请求次数,减轻了服务器压力,请求速度更快,前端性能优化。这是弱缓存。缓存到本地,走的是虚拟内存机制。

------------------------------------------------------------

2-3开头的都代表成功;

4-5开头的都代表失败;

400 bad request。参数错误

401 无权限访问。

404请求地址错误。

---------------------------------------------------------------

500 未知服务器错误。

503 服务器超负荷。

传统的tomcat,四五百。基于nginx,提高一倍。node作为服务器中转层的原因,提高并发数。

1秒几十个亿,几百个亿。除了购买大量服务器,提高单体并发数也是很重要的。

  1. 浏览器渲染

URL地址解析=》dns域名解析=》tcp三次握手=》向服务器发http请求=》服务器接收到请求后,由它的web服务器处理请求并返回,最后再通过http返回给客户端

返回给客户端的一定是 资源文件的源代码

我们看一下加载一个html的过程:

首先发的第一个请求肯定是请求一个主页面:

浏览器接收到的就是一堆源代码;

浏览器本身是多线程的,但是渲染代码是单线程;

veiwport:响应视口;dns预处理,以后碰到http://img.zhufengpeixun.cn就不需要dns解析了;

link标签,请求css会分配一个新的线程去加载,渲染页面主线程继续向下渲染;

script标签,默认是同步,……

渲染步骤:

  1. 解析html,生成dom树;刚开始是生成dom tree,从头到尾渲染完时dom结构都已经渲染完了,但是没有样式,结构层级已经知道了;样式回来之后生成cssom树;

  2. 两者结合生成render tree,有结构也有样式的树;

  3. painting渲染重绘,最后显示在页面上

这是第一次渲染。

但是我通过js在界面第一次渲染完之后,可以继续更改dom的结构和样式;那跟我第一次render tree就不一样了:比如,之前有1个,现在有2个;之前有5个,现在有4个……;或者改变排版布局的位置,之前是左边改到右边;彻底把结构改了,改它的结构样式;

回流&重绘

这里有2个概念:

重绘:

元素的样式改变,但是宽高大小位置不变。

比如只把背景颜色改了

回流(重排):

页面的布局和几何信息发生改变。

浏览器要重新计算dom树,拿新的dom树和cssom树集合形成新的渲染树……

其实是把第一次渲染页面的事重新干了一遍,只不过不需要重新加载css,不需要解析css;当然也有自己的缓存机制,跟之前一样的就快速过去了;肯定比第一次快,但是额外浪费了很多性能;

所以性能优化:

以数据来驱动视图,而不是传统以jquery直接来操作dom;因为操作dom必然会引发回流,回流是非常耗性能的;每次回流都要把dom tree重新计算,都要重新生成render tree,都要重新painting;

所以前端性能优化☞减少dom操作

数据驱动视图:框架内部实现统一的dom操作;虚拟dom+dom diff,只把有变化的重新处理;

优化措施

自己手动操作dom:

读写操作分离:渲染队列机制,读操作会刷新渲染队列;

样式集中改变:使用className或者cssText批量修改样式;

元素批量修改:

最好的方式:文档碎片

操作dom第一个想到的就是dom的回流和重绘

  1. 断开连接TCP四次挥手

4次挥手发生在信息传输过程中,3次握手发生在信息传输之前

那下次再发请求,又需要3次握手,发请求,再挥手……

我希望是不断开不用握手了,保持TCP协议的长连接,通过Connection:Keep-Alive

建立连接的时间:过了这段时间就过期;

在某个阶段让服务器主动断开;

总结

输入一个网址按下enter键,中间经历了几个步骤:7个步骤

  1. URL地址解析:从URL中解析出,协议+域名+端口号+资源路径+问号参数等,需要编码encodeURI;

  2. dns域名解析:解析出外网ip地址;

  3. 建立tcp连接通道,3次握手;

  4. 基于http协议传输给服务器;

  5. web服务器HTTP响应报文;

  6. 浏览器渲染;

  7. 断开tcp

网络通信——客户端服务器端交互相关推荐

  1. 浅析Java web程序之客户端和服务器端交互原理

    原文链接: https://www.iteye.com/topic/470019 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考 ...

  2. 封装一个类搞定90%安卓客户端与服务器端交互

    本实例封装了一个处理安卓客户端与服务器端交互的几个方法,对于中文乱码问题本实例也找到了解决方案.本例可以处理的场景如下: 1.与服务器端交互json数据. 2.Get方式与服务器端交互数据. 3.Po ...

  3. java 实现 web 客户端_Java web客户端和服务器端交互的原理

    Java web客户端和服务器端交互的原理 其实HTTP客户端和服务器端的交互原理很简单:即先是浏览器和服务器端建立Socket无状态连接,也就是短连接,然后通过IO流进行报文信息(这个报文是严格遵循 ...

  4. java基于http协议客户端与服务器端的交互,通俗易懂客户端与服务器端交互原理(HTTP数据请求与HTTP响应,包括Servlet部分...

    经 常看到HTTP客户端与服务器端交互原理的各种版本的文章,但是专业术语太多,且流程过于复杂,不容易消化.于是就按照在 Servlet 里面的内容大致做了一些穿插.本来 连 Tomcat 容器 和 S ...

  5. 客户端与服务器端交互原理

    客户端与服务器端交互原理 经常看到HTTP客户端与服务器端交互原理的各种版本的文章,但是专业术语太多,且流程过于复杂,不容易消化.于是就按照在 Servlet 里面的内容大致做了一些穿插.本来连 To ...

  6. ZK5.0和客户端+服务器端相结合的编程方式

    译注:我对JSF比较熟悉,最近想研究一些其它的事件驱动的基于组件的WEB层框架,继Wicket和GWT之后,我开始仔细学习了一下ZK,虽然之前说的那几种框架也各有很多的优点,但ZK还是给了我很强的冲击 ...

  7. 安卓应用开发Socket通信 客户端+服务器端

    安卓应用开发Socket通信 客户端+服务器端 1. 添加网络权限 <uses-permission android:name="android.permission.INTERNET ...

  8. C#+Socket 聊天室(实现公网通信 客户端-服务器端-客户端)

    文章目录 简述 功能演示视频(b站) 准备工作 服务器端 服务器端界面 服务器端代码 客户端 客户端界面 客户端代码 总结 简述 关于Socket的原理我就不在这里赘述了,有大佬已经作详细的说明了: ...

  9. 实现服务器和客户端数据交互,Java Socket有妙招

    摘要:在Java SDK中,对于Socket原生提供了支持,它分为ServerSocket和Socket. 本文分享自华为云社区<Java Socket 如何实现服务器和客户端数据交互>, ...

最新文章

  1. python作图一览
  2. 服务器的ras性能指标,Unix服务器6大原则深度讲解
  3. Linux上常用命令整理(二)—— paste
  4. python求球的表面积_892. 三维形体的表面积(Python)
  5. 海量数据拆分到nosql系统的一种方案
  6. 计量科学大数据分级分类
  7. 我的第一个 RN 项目-趣闻
  8. 利用阿里云搭建Java Web开发环境
  9. php和python-PHP和Python性能比较:放弃PHP改用Python
  10. 面向服务架构(SOA)和企业服务总线(ESB)
  11. 软件工程——五大模型
  12. Python函数的输出
  13. mouseover mouseout和mouseenter mouseleave的区别
  14. oracle 递归用法,oracle递归用法
  15. java 之DelayQueue实际运用示例
  16. 一个记账易app开发
  17. MAC上VSCode无Git源代码管理的解决办法
  18. 3个月红酒上千万的营业额:新模式下的营销奥秘
  19. 使用 Microsoft RDC for Mac 在 Mac 和 Windows 间传文件
  20. 一文看懂怎么用 Python 做数据分析

热门文章

  1. 跨境电商遭遇知识产权侵权如何成功申诉?
  2. win8.1 安装 PL2303 HXA 驱动教程
  3. 【硬件驱动】360驱动大师 v2.0.0.1660单文件网卡绿化版
  4. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇...
  5. 爬虫的基本原理:爬虫概述及爬取过程
  6. 全国计算机二级今年更难吗,全国计算机二级好过吗
  7. 软考中级到高级我都是怎么考的
  8. Python鸟巢0926
  9. 农村小学计算机教育论文参考文献,小学信息技术参考文献
  10. Java 解析GPS芯片 的经纬度信息