网站设计建设案例,网站平台建设成本,住房建设网站,招标网app下载七层 应用进程 粘包问题以及如何理解是 TCP 面向字节流协议#xff1f; 之所以会说 TCP 是面向字节流的协议#xff0c;UDP 是面向报文的协议#xff0c;是因为操作系统对 TCP 和 UDP 协议的发送方的机制不同#xff0c;也就是问题原因在发送方。 先来说说为什么 UDP 是面…七层 应用进程 粘包问题以及如何理解是 TCP 面向字节流协议 之所以会说 TCP 是面向字节流的协议UDP 是面向报文的协议是因为操作系统对 TCP 和 UDP 协议的发送方的机制不同也就是问题原因在发送方。 先来说说为什么 UDP 是面向报文的协议 当用户消息通过 UDP 协议传输时操作系统不会对消息进行拆分每个 UDP 报文就是一个用户消息的边界这样接收方在接收到 UDP 报文后读一个 UDP 报文就能读取到完整的用户消息。由于UDP有消息保护边界不会发生粘包拆包问题
你可能会问如果收到了两个 UDP 报文操作系统是怎么区分开的
操作系统在收到 UDP 报文后会将其插入到队列里队列里的每一个元素就是一个 UDP 报文这样当用户调用 recvfrom() 系统调用读数据的时候就会从队列里取出一个数据然后从内核里拷贝给用户缓冲区。 再来说说为什么 TCP 是面向字节流的协议 当用户消息通过 TCP 协议传输时消息可能会被操作系统分组成多个的 TCP 报文也就是一个完整的用户消息被拆分成多个 TCP 报文进行传输。
这时接收方的程序如果不知道发送方发送的消息的长度也就是不知道消息的边界时是无法读出一个有效的用户消息的因为用户消息被拆分成多个 TCP 报文后并不能像 UDP 那样一个 UDP 报文就能代表一个完整的用户消息。
因此我们不能认为一个用户消息对应一个 TCP 报文正因为这样所以 TCP 是面向字节流的协议。 ------
tcp是基于字节流传输的使用tcp协议传输的数据是无边界的。。。 解决方法
固定包大小浪费空间,
设置标志位
我们可以在两个用户消息之间插入一个特殊的字符串这样接收方在接收数据时读到了这个特殊字符就把认为已经读完一个完整的消息。
自定义消息结构
我们可以自定义一个消息结构由包头和数据组成其中包头包是固定大小的而且包头里有一个字段来说明紧随其后的数据有多大。 getpost
使用场景上
在做数据查询时建议用Get方式而在做数据添加、修改或删除时建议用Post方式Get方式的安全性较Post方式要差些包含机密信息的话建议用Post数据提交方式 时间消耗上
Get和Post还有一个重大区别 Get产生一个TCP数据包Post产生两个TCP数据包。
对于Get方式的请求浏览器会把http header和data一并发送出去服务器响应200返回数据而对于Post浏览器先发送header服务器响应100 continue浏览器再发送data服务器响应200 ok返回数据。
比如说Get只需要汽车跑一趟就把货送到了而Post得跑两趟第一趟先去和服务器打个招呼“嗨我等下要送一批货来你们打开门迎接我”然后再回头把货送过去。由于Post需要两步时间上消耗的要多一点所以Get比Post更有效率。 http缓存 SSL/TLS握手过程