即时通讯工具的聊天记录保存在哪里??

即时通讯工具的聊天记录保存在哪里??,第1张

请问你使用的是那个即时通讯工具!比如QQ,淘宝.等等本地都有保存的.MSN经过设置之后也是有保存的,保存在服务器是一些收费服务普通即时通讯工具都没有这样的服务的.

一般情况下交易的时候我都是经过截图来保存证据的!

im的客户端与服务器通过发送报文(也就是请求包)来完成消息的传递,报文分为三种,请求报文(request,后简称为为R),应答报文(acknowledge,后简称为A),通知报文(notify,后简称为N),这三种报文的解释如下:

R:客户端主动发送给服务器的报文

A:服务器被动应答客户端的报文,一个A一定对应一个R

N:服务器主动发送给客户端的报文

用户A给用户B发送一个“你好”,很容易想到,流程如下:

1)client-A向im-server发送一个消息请求包,即msg:R

2)im-server在成功处理后,回复client-A一个消息响应包,即msg:A

3)如果此时client-B在线,则im-server主动向client-B发送一个消息通知包,即msg:N(当然,如果client-B不在线,则消息会存储离线)

从流程图中容易看到,发送方client-A收到msg:A后,只能说明im-server成功接收到了消息,并不能说明client-B接收到了消息。在若干场景下,可能出现msg:N包丢失,且发送方client-A完全不知道,例如:

a 、服务器崩溃,msg:N包未发出

b 、网络抖动,msg:N包被网络设备丢弃

c 、client-B崩溃,msg:N包未接收

结论是悲观的:接收方client-B是否有收到msg:N,发送方client-A完全不可控,那怎么办呢?

upd是一种不可靠的传输层协议,tcp是一种可靠的传输层协议,tcp是如何做到可靠的?答案是:超时、重传、确认。

要想实现应用层的消息可靠投递,必须加入应用层的确认机制,即:要想让发送方client-A确保接收方client-B收到了消息,必须让接收方client-B给一个消息的确认,这个应用层的确认的流程,与消息的发送流程类似:

4)client-B向im-server发送一个ack请求包,即ack:R

5)im-server在成功处理后,回复client-B一个ack响应包,即ack:A

6)则im-server主动向client-A发送一个ack通知包,即ack:N

至此,发送“你好”的client-A,在收到了ack:N报文后,才能确认client-B真正接收到了“你好”。

会发现,一条消息的发送,分别包含(上)(下)两个半场,即msg的R/A/N三个报文,ack的R/A/N三个报文,一个应用层即时通讯消息的可靠投递,共涉及6个报文,这就是im系统中消息投递的最核心技术(如果某个im系统不包含这6个报文,不要谈什么消息的可靠性)。

1)client-A向im-server发送一个消息请求包,即msg:R

2)im-server在成功处理后,回复client-A一个消息响应包,即msg:A

3)如果此时client-B在线,则im-server主动向client-B发送一个消息通知包,即msg:N(当然,如果client-B不在线,则消息会存储离线)

4)client-B向im-server发送一个ack请求包,即ack:R

5)im-server在成功处理后,回复client-B一个ack响应包,即ack:A

6)则im-server主动向client-A发送一个ack通知包,即ack:N

至此,发送“你好”的client-A,在收到了ack:N报文后,才能确认client-B真正接收到了“你好”。

TCP是一个可靠的传输协议,它是面向连接(3次握手成功了才能开始传输)。

TCP 协议是流式协议。那么这句话到底是什么意思呢?所谓流式协议,即协议的内容是像流水一样的字节流,内容与内容之间没有明确的分界标志,需要我们人为地去给这些协议划分边界。 那什么是粘包? 所谓粘包就是连续给对端发送两个或者两个以上的数据包,对端在一次收取中可能收到的数据包大于 1 个,大于 1 个,可能是几个(包括一个)包加上某个包的部分,或者干脆就是几个完整的包在一起。(简单的来说就是TCP是流协议,几个数据包是一起发送过去被接收到的。一波流嘛!!)

有的面试官可能会这么问 :网络通信时,如何解决粘包、丢包或者包乱序问题?这个问题其实是面试官在考察面试者的网络基础知识,如果是 TCP 协议,在大多数场景下,是不存在丢包和包乱序问题的。TCP 通信是可靠通信方式,TCP 协议栈通过序列号和包重传确认机制保证数据包的有序和一定被正确发到目的地。那么面试官这么问你,其实就是要你回到怎么解决粘包的问题?

简单来说几时接收端在接收到一波流数据之后,怎么把这波流数据中去区分出那是几个数据包,包与包之间的边界怎么去界定?解决了界定问题的过程就是所谓的拆包过程。那么如何区分界定呢?目前主要有三种方法:

这就是一个典型的包头格式,bodySize 指定了这个包的包体是多大。由于包头大小是固定的(这里是 size(int32_t) + sizeof(int32_t) = 8 字节),对端先收取包头大小字节数目(当然,如果不够还是先缓存起来,直到收够为止),然后解析包头,根据包头中指定的包体大小来收取包体,等包体收够了,就组装成一个完整的包来处理。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/314763.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存