网络与协议学习(一)

关于网络协议学习,我们都知道通信网有osi七层协议,互联网有tcp/ip五层协议、tcp/ip四层协议。本文通过参考他人博客记录所得,参考网址见文尾。

osi七层协议
tcp/ip五层协议
tcp/ip四层协议

网络分层

数据传输过程:

传输过程

传输层: TCP\UDP协议

TCP\UDP的区别:
tcp协议:面向连接,消息可靠,相对udp来讲,传输速度慢,消息是面向流的,无消息保护边界。
udp协议:面向无连接,消息不可靠,传输速度快,消息是面向包的,有消息保护边界。

三次握手与四次挥手过程
TCP与UDP下socket差异对比:
传输过程

缓冲区

在这里插入图片描述

缓冲区: 暂时存放传输数据的,防止你的程序在发送数据的时候卡住,提高代码运行效率
输入缓冲区:recv
输出缓冲区:send
缓冲区有长度限制
MTU:最大传输单元,网络层限制是1500B,每次发送数据的时候不要超过这个数

粘包

须知:只有TCP有粘包现象,UDP永远不会粘包
粘包不一定会发生,如果发生了:1.可能在客户端已经粘了2.客户端没有粘的话就是在服务端粘了
第一种:连续发送小的数据,间隔时间短,可能一次就接收到了这几个连续的拼接在一起的小数据(发送端需要等缓冲区满才发送出去,造成粘包-发送数据时间间隔很短,数据量很小,会当做一个包发出去产生粘包)
首先需要掌握一个socket收发消息的原理:

socket收发过程
应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,这也是容易出现粘包问题的原因。(因为TCP是流式协议,不知道啥时候开始,啥时候结束)。而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和TCP是很不同的。怎样定义消息呢?可以认为对方一次性write/send的数据为一个消息,需要明白的是当对方send一条信息的时候,无论底层怎样分段分片,TCP协议层会把构成整条消息的数据段排序完成后才呈现在内核缓冲区。

所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。
原因:为了提高tcp传输效率,内部提供了一个叫做Nagel算法,就是为了避免你连续发送小的数据
第二种:当一次接收的数据小于你一次发送的数据长度,那么一次接收完剩下的数据会在下一次接收数据的时候被一起接收.
原因:面向流的传输
粘包的根本原因: 两端互相不知道对方发送数据的长度,所以解决粘包的方法就是解决如何让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循环接受完所有数据

参考内容:

1、https://www.cnblogs.com/russellyoung/p/wang-luo-xie-yi.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值