TCP和UDP
1.网络通信协议
网络通信协议:为什么要有网络通信协议呢?就好比在现实中要有法律法规一样,这样才能让社会更加和谐.那么通信协议这是怎样一个规则呢?它对协议中数据传输的格式,速率,步骤等做了统一的规定.那么,大家就必须要遵守该协议,以达到数据交换的目的;
TP/IP:是Internet最基本的.也是最广泛的协议.采用了4层的分层模型,一层呼叫下一层的方式完成需求.哎,是不是感觉这个4和之前讲的ping中数据包数量为4对上了?@*@;
2.协议
刚刚说了,在网络中进行数据的交换必须遵守某种协议才可以完成.那么这个"某种"协议都有哪些种类呢?在java.net包中可以查看TCP/UDP两种协议的对应代码实现.
2.1.TCP : TransmissionControl Protocol
传输控制协议.
有什么显著特点呢?
面向连接的通信协议:什么是面向连接,字面就可以看出,以连接为主的通信协议;具体就是在数据传输之前,客户端和服务端要已经建立起连接,并双方都已经确认建立起了连接.这样,就可以保证客户端和服务端之间无差错的进行数据传输.(这里说客户端和服务端似乎不太贴切,但大致是这个意思);
那么,既然是面向连接的通信协议,并确认已连接后才进行数据传输,如何去保证呢?
这里就涉及到了TCP协议中熟知的三次握手了:
第一次握手:客户端向服务端放出连接请求,并且等待服务器的确认;
第二次握手:服务端向客户端回送一个响应,通知客户端接收到额请求;
第三次握手:客户端再次向服务端发送确认消息,确认连接.
完成三次握手后,才可以进行数据传输;
那么一般什么情况使用TCP协议呢? 比如:文件的下载,网页的浏览等.
是不是觉着很麻烦?所以可以看出TCP协议效率肯定是不高的;所以,必然会出现一种效率高的协议;就是UDP了.
2.2.UDP:User Datagram Protocol
用户数据报协议,TCP是面向连接的通信协议,所以UDP就是面向无连接的协议了,恩,没有开玩笑,是这样的.不管传输的目的地对象是否已开启或连接,直接将相关数据封装到数据包中,发送.当然,每个数据包的大小是有限制的,在64k以内.
对比TCP来看,UDP的特点是什么?
1.因为没有进行三次握手,也就不知道对方是否连接,这种情况还进行数据传输,必然是不可靠的协议了,对吧.所以呢,数据容易丢失.
2.但同时,传输速度也很快.
3.同时,也不安全.
一般什么情况下使用UDP协议呢?比如:QQ呀,进行的视频会议呀等待.
3.http : HyperText Transfer Protocol
等等,那么我们平时访问的这种https://www.jianshu.com/,前面的http是什么?这里是https是因为新增的;
所以需要介绍一下http协议:
是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。 其实最初就是为了提供发布和接受html的方法.它不涉及数据包传输,默认端口是80
常见的状态码有以下:相信大家也都见过.
1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接受
3xx重定向——需要后续操作才能完成这一请求
4xx请求错误——请求含有词法错误或者无法被执行
5xx服务器错误——服务器在处理某个正确请求时发生错误
4.区别?
ちょっと待って ...............
都是什么啊?完全懵了@*@...................
哈哈....我也是............
刚刚有提到4层模型(也有按7层分,可怕,搞不懂),那么我就从网上找张图,对比着看,简单的区分http/tcp/udp/ip一下:
从上图可知:
HTTP是:第四层应用层,也就是我们平时接触的;
TCP/UDP:传输层,负责数据包的传输,注意啦,要知道面向连接/面向无连接的区别!比如:传输的数据方式,数据包大小限制,安全性等的区别;
IP(Internet Protocol):网络层;
至于ARP/RARP,有的放在第二层有的放在第一层,我也还不了解;
所以,HTTP是基于TCP的一个超级文本传输协议
5.Http连接
5.1特点
既然说到HTTP了,那么有什么特点呢?
1.无连接.就是每次只处理一个请求;
2.无状态:就是指对处理的事务没有记忆;
3.灵活呀;Content-Type指定一下数据类型就可以了,比如html,text呀,JSON呀等;
因为http的无状态无连接特点,因此就出现了一个问题,如果我一端更新了某个内容,另一端如何能及时的知道呢?而不是等了好几天,甚至好几个月才知道.于是出现了Ajax轮询和long poll方法.那么就来了解一下.
5.2Ajax轮询
原理:其实就是浏览器每隔一段时间(几秒钟把一般)发送一次请求给客户端,询问服务是否有新的信息;
模拟一下,Alice是浏览器,Bob是客户端;(注:Alice的每一句都是一个请求,Bob的每一句都是一个响应;)
Alice:Bob,你那边有没有新的消息?
Bob:还没有~~~
Alice:Bob,你那边有没有新的消息?
Bob:还没有~~~
Alice:Bob,你那边有没有新的消息?
Bob:有了,是******
Alice:Bob,你那边有没有新的消息?
Bob:还没有~~~
............................
............................
但是这个有什么问题呢?因为浏览器需要不停的想你询问?假如,淘宝这种有几个亿用户的网站,会怎么样?会不会容易使服务器崩溃呀,即使服务器有再快的处理速度,也不足够呀.
因此这种方式,消耗很大的服务器内存和资源;
代码实现是什么样呢?其实也就是多了个回调函数.
5.3long poll
原理:也是浏览器(或客户端)向服务端发送请求询问是否有内容需要更新,只是long poll采用的是阻塞式的.
什么是阻塞什么是非阻塞?这里简单说一下.
阻塞:就是程序去执行一段代码,比如执行到了某一步(非常消耗时间),它就一直在这等着,非得等到这一步执行完了才能继续向下执行;
非阻塞:同样的程序去执行一段代码,也是遇到可某一步(也是非常的消耗时间),这个时候它继续执行做其它事情,等你执行完了告诉我一声就好了;
好,来看一下long poll是什么?
同样的,模拟一个情景.模拟一下,Alice是客户端,Bob是客户端;(注:Alice的每一句都是一个请求,Bob的每一句都是一个响应;)
Alice:Bob,你那边有没有新的消息?(2018.09.10 9:30)
Alice:Bob,你那边有没有新的消息?(2018.09.10 9:32)
Alice:Bob,你那边有没有新的消息?(2018.09.10 9:34)
Alice:Bob,你那边有没有新的消息?(2018.09.10 9:36)
Alice:Bob,你那边有没有新的消息?(2018.09.10 9:37)
Bob:.....long time goes...............................suddenly,Alice,我这边有新内容啦!
所以,long poll就是客户端给服务器发送一个请求,如果客户端没有回复,就一直请求.服务端呢?如果没有新的消息就一直不响应客户端.直到有了新的消息才会响应;然后再次建立连接;
但是这个存在什么问题呢?你想一下,客户端一直向服务器发送请求,如果想京东淘宝那种有几个亿用户的网站,会怎样呢?一分钟会有几十亿的请求还是几百亿的去请求?这就是高并发啦!什么?到了高并发?什么事高并发?简单地说,就是同一时间有特别特别多的用户访问你的网站并执行某个操作(这里说的不是很准确感觉);
6.长连接需求
那么如果有这种需要建立长连接的需求,该怎么做?
这个时候,websocket应运而生~~~
鼓掌欢迎一下[图片上传失败...(image-d9888c-1540300658087)]
什么是websocket?
WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
产生背景?
现在,很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
而比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。
在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
Websocket使用ws或wss的统一资源标志符,类似于HTTPS,其中wss表示在TLS之上的Websocket。如:
算了,上面都是在Wiki上面复制的,可以去维基百科上搜一下websocket看一下就好了!
应用呢?
比如很火的数字货币BitCoin,里面的挖矿之后广播通知所有的人就是用的websocket;但,比特币,也是区块链技术的1.0版本,个人认为思想是最经典的!在这里并不是去中心化的,因为大家都需要去他所指定的几个端口注册一下节点,才能与其他人进行通信(比特币白皮书可以看到);
~
待更新~
如有错误,欢迎指正!
参考了很多的博客,wiki,但是我都忘了参考了那些博客,这里也没法贴出地址来了,以后注意这方面把!