网络协议学习记录一

一,互联网协议

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

数据传输过程:08249E4144A9EDD1113DA5F0D9325A8B

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

三次握手与四次挥手过程

TCP与UDP下socket差异对比

92D144E1AD29E89A747EA8205A45F03E

缓冲区

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

粘包

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

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

所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。
  • 原因:为了提高tcp传输效率,内部提供了一个叫做Nagel算法,就是为了避免你连续发送小的数据
    第二种:当一次接收的数据小于你一次发送的数据长度,那么一次接收完剩下的数据会在下一次接收数据的时候被一起接收.
  • 原因:面向流的传输

粘包的根本原因: 两端互相不知道对方发送数据的长度,所以解决粘包的方法就是解决如何让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循环接受完所有数据。

针对上面的原因有两种解决粘包的方案

  1. 在发送数据前,先发送数据的长度,那么接收根据数据的长度来进行接收数据

猜你喜欢

转载自www.cnblogs.com/russellyoung/p/wang-luo-xie-yi.html
今日推荐