A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 小江哥 于 2018-6-22 09:23 编辑

网络通信相关
-  tcp
-  http
- 协议抽象


1. Tcp
我们的两台计算机进行交互,需要三个步骤
1. 一方请求连接另一方
2. 双方确认能够通信,连接建立完成
3. 双方发送信息

我们所说的tcp就是这样建立两台计算机连接的一种底层技术。

1.1 请求连接(ip+端口)
假设有一个路由器,我们有两台电脑连接在这个路由器上,他们的ip地址分别是
电脑A192.168.1.100
电脑B192.168.1.101
假设我们的电脑A上有tomcat,那么我们的电脑B首先可以通过  
192.168.1.100
找到我们的电脑A

那么怎么找到我们的tomcat呢,一台电脑上有很多应用程序qq、微信、浏览器、mysql等等等等,我们可以想到我们的端口。
Tomcat :   8080

那么我们可以通过8080找到tomcat
至此我们在电脑B上发起了向电脑Atomcat的连接请求


1.2 建立连接(三次握手)
1.1中我们已经从BA发起了连接,但他们互相不知道对方能否接受自己的数据,就像我们在街上看到一个外国人,但不知道他懂不懂中文。所以我们需要确认

B  ->  A    你听得懂我说的话吗
A  ->  B    我听得懂,你听得懂我说的吗
            此时,BA都已经确认 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 断开连接
AB任意一方切断连接,此次连接关闭,AB释放对应维护此次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是无状态的,cookiesession技术引导
我们已经知道了http协议是进行一次请求-响应后就立刻被切断,这样就会导致一个问题,我们举个例子:

客户A拨打客服电话,客服说我找一找您的个人资料,您先不要挂断,这就相当于tcp连接,连接不切断,只要电话不挂断,客服人员都还知道这个打电话的人是客户A。可是当他挂断了电话之后,客户A再打电话过来如果不说自己是客户A,客服人员也不知道他到底是谁。

http就是存在这样一个问题:无状态
由于每次连接都是一个新连接,所以服务器无法得知这个请求上一次访问了什么,也无法得知这个人有没有登录,服务器只知道,对于我来说,又来了个连接,我不知道是谁。

但是我们存在一个很常用的应用场景:登录
我们的http是无状态的,当前用户登录后,如何保存他的登录状态?下次这个用户访问服务器的时候,服务器能认出——哦,你是上次登陆过的人。

由此出现了cookiesession技术



2.4 cookiesession
我们从cookie说起,没有cookie,就没有session
Cookie是保存在浏览器上的一小段数据,它的存储形式是我们熟知的key-value

这段数据具有以下特点:
1. 数据是保存在浏览器的,不安全
2. Cookie的每一个key的数据可以设置过期时间
3. Cookie是不能跨域的

一条一条说
1. 数据是保存在浏览器的,不安全
这个好理解,浏览器上的东西很容易被”高手”破解,毕竟浏览器不在我们的可控范围内

2. Cookie的每一个key的数据可以设置过期时间
这个是说cookie的一个过期时间,也没有什么好讲的

3. cookie是不能跨域的
这是什么意思呢,我们在服务器中通过request对象是可以获取到浏览器中保存的cookie的,但是只能访问自己对应域下的cookie
比如 www.baidu.com 只能访问自己设置的cookie,不能访问 www.taobao.com 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 表单提交、ajaxwebservice
我们分析一个基本的网页表单提交,这背后做了什么
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=adminpassword=admin,参数和参数之间用&隔开

使用post请求,并使用content-type=application/json,发送数据用json格式发送





0 个回复

您需要登录后才可以回帖 登录 | 加入黑马