本帖最后由 小江哥 于 2018-6-22 09:23 编辑
网络通信相关- tcp - http - 协议抽象
1. Tcp我们的两台计算机进行交互,需要三个步骤 1. 一方请求连接另一方 2. 双方确认能够通信,连接建立完成 3. 双方发送信息
我们所说的tcp就是这样建立两台计算机连接的一种底层技术。
1.1 请求连接(ip+端口)假设有一个路由器,我们有两台电脑连接在这个路由器上,他们的ip地址分别是 电脑A: 192.168.1.100 电脑B: 192.168.1.101 假设我们的电脑A上有tomcat,那么我们的电脑B首先可以通过 192.168.1.100 找到我们的电脑A
那么怎么找到我们的tomcat呢,一台电脑上有很多应用程序qq、微信、浏览器、mysql等等等等,我们可以想到我们的端口。 Tomcat : 8080
那么我们可以通过8080找到tomcat 至此我们在电脑B上发起了向电脑A的tomcat的连接请求
1.2 建立连接(三次握手)在1.1中我们已经从B向A发起了连接,但他们互相不知道对方能否接受自己的数据,就像我们在街上看到一个外国人,但不知道他懂不懂中文。所以我们需要确认
B -> A 你听得懂我说的话吗 A -> B 我听得懂,你听得懂我说的吗 此时,B和A都已经确认 A能听懂B说话,但不知道B是否听得懂A说话 B -> A 我也听的懂你说话 双方确认都能听懂,连接建立成功
上面三个过程就是三次握手,也就是双方会确认彼此能够通信
1.3 双方互相通信双方按照一定的格式进行通信,比如都是json数据,双方能正常解析即可 B -> A { “method”:”getUser”, “args”:{ “username”:”zhangsan123” } }
A -> B { “code”:0, “data”:{ “username”:”zhangsan123”, “password”:”321zs” }
}
这里的json的格式,双方协定好即可
1.4 断开连接A与B任意一方切断连接,此次连接关闭,A和B释放对应维护此次tcp连接的资源
2. Http2.1 Http是基于tcp的在1.*里我们已经完整的讲述了tcp连接,接下来我们讲http。 首先我们要明确的一点是http是基于tcp的,他是tcp的一个分支。在上面的话术中我们得知tcp是建立两台电脑通信的手段,但是它是存在缺陷的
1. web应用中客户群体是非常大的,如果对每个用户都维护一个tcp连接对象,会导致服务器压力大 2. Tcp只解决了两台电脑通信问题,没有规定一个具体的双方通信的数据格式
为了解决这两个问题,http就出现了。
2.2 Http的基本模型 -> 请求-响应Tcp协议中只要连接不被断开,服务器和客户端的连接对象会一直被维护,并且双方随时都能给对方发送数据,除非连接被切断,连接对象被销毁。 在http中,我们使用了 请求-响应 的一种模型,换句话说也就是
1) 我们的客户端发起连接请求 2) 三次握手,连接建立成功 3) 客户端发送请求数据,可以看作客户端在问服务器一个问题 4) 服务器对这个问题做出回答,也就是做出响应 5) 切断连接,服务器释放连接对象
我们可以看到,客户端和服务器做了一次对话后连接就断开了,虽然频繁创建和销毁对象会降低运行效率,但是对于早期的计算机来说,由于内存不足、cpu性能低下的情况,无法维护大量tcp,所以在一次请求-响应后连接就需要切断
2.3 Http是无状态的,cookie和session技术引导我们已经知道了http协议是进行一次请求-响应后就立刻被切断,这样就会导致一个问题,我们举个例子:
客户A拨打客服电话,客服说我找一找您的个人资料,您先不要挂断,这就相当于tcp连接,连接不切断,只要电话不挂断,客服人员都还知道这个打电话的人是客户A。可是当他挂断了电话之后,客户A再打电话过来如果不说自己是客户A,客服人员也不知道他到底是谁。
http就是存在这样一个问题:无状态 由于每次连接都是一个新连接,所以服务器无法得知这个请求上一次访问了什么,也无法得知这个人有没有登录,服务器只知道,对于我来说,又来了个连接,我不知道是谁。
但是我们存在一个很常用的应用场景:登录 我们的http是无状态的,当前用户登录后,如何保存他的登录状态?下次这个用户访问服务器的时候,服务器能认出——哦,你是上次登陆过的人。
由此出现了cookie和session技术
2.4 cookie和session我们从cookie说起,没有cookie,就没有session。 Cookie是保存在浏览器上的一小段数据,它的存储形式是我们熟知的key-value。
这段数据具有以下特点: 1. 数据是保存在浏览器的,不安全 2. Cookie的每一个key的数据可以设置过期时间 3. Cookie是不能跨域的
一条一条说 1. 数据是保存在浏览器的,不安全 这个好理解,浏览器上的东西很容易被”高手”破解,毕竟浏览器不在我们的可控范围内
2. Cookie的每一个key的数据可以设置过期时间 这个是说cookie的一个过期时间,也没有什么好讲的
3. cookie是不能跨域的 这是什么意思呢,我们在服务器中通过request对象是可以获取到浏览器中保存的cookie的,但是只能访问自己对应域下的cookie
那么我们继续说session,我们已经知道了服务器中可以通过request对象拿到cookie中的数据。我们可以在我们的服务器中有一个map集合
Map<String, Session> sessionMap = new HashMap<String, Session>();
我们可以这样: 1. 对每一个访问过服务器的用户在cookie中保存一个uuid值,这个值的key叫做sessionID 2. 用户访问后读取cookie中的sessionID 3. 在sessionMap中通过sessionID找到一个session对象 4. 我们可以通过这个session对象获取和存储数据
我们可以看到session是基于cookie的,对于需要安全的数据,我们把数据保存在session中。
2.5 表单提交、ajax、webservice我们分析一个基本的网页表单提交,这背后做了什么 1. 在浏览器上输入访问的地址 2. 浏览器向对应的地址发送http请求 3. 服务器做出响应 4. 浏览器处理服务器响应的数据,如果是html页面则进行html解析,如果是图片则显示,如果是zip就下载,总之浏览器会解析,并把解析的结果展现出来
我们分析ajax请求做了什么 1. 在我们的js代码中发送一个请求 2. 服务器做出响应 3. 在我们的回调函数中处理响应的数据
对比一下上面的两个http的请求,我们发现http本身没有变,只是对响应的数据处理从浏览器到我们自己写的js代码了
我们再分析一下webservice原理,我们能通过浏览器发送http请求,我们能不能通过java代码发送http请求呢? 当然是可以的,我们说过http是基于tcp的,只要能建立tcp连接,并使用http协议的格式与模型,我们就能发送http请求。
1. Java代码中创建WebClient对象 2. WebClient对象向指定地址发送请求 3. 指定服务器处理请求,响应数据 4. WebClient对象拿到响应的数据,将数据封装到对象 5. 实现系统间通信
webClient.create(“http://localhost:8081/bos_crm/customer/”+cid).get(Customer.class) Dubbo/zookeeper
3. 协议抽象http我们可以看作是 Tcp + 规定的传输协议 -> http协议 其中规定的传输协议是我们的 请求:请求行、请求头、请求体 响应:响应头、响应体
我们可以看看几个url地址 jdbc:mysql://127.0.0.1:3306?charset=utf8 redis://localhost:6379
可以看到,格式为 协议名://ip:端口/访问路径?参数列表
那么可以看到我们的redis是使用redis协议传输数据的,mysql使用mysql协议,他们的原理也无外乎使用tcp建立连接,然后规定数据传输格式来发送数据
补充: 前端往后端传值的几种方式 1. 在url中的?后, 这里带了两个参数,username=admin和password=admin,参数和参数之间用&隔开
使用post请求,并使用content-type=application/json,发送数据用json格式发送
|