• 网络协议学习记录一


    一,互联网协议

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

    数据传输过程:08249E4144A9EDD1113DA5F0D9325A8B

    传输层: TCPUDP协议
    TCPUDP的区别:
    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. 在发送数据前,先发送数据的长度,那么接收根据数据的长度来进行接收数据
  • 相关阅读:
    关于开源的RTP——jrtplib的使用
    常见hash算法的原理
    cocos2dx触屏响应(单点触摸)CCTouchBegan,CCTouchMove,CCTouchEnd
    SD卡中FAT32文件格式高速入门(图文具体介绍)
    HDU 4916 树形dp
    图像识别技术
    shell语法简单介绍
    MATLAB新手教程
    java堆栈 (转)
    给字符数组赋值的方法
  • 原文地址:https://www.cnblogs.com/russellyoung/p/wang-luo-xie-yi.html
Copyright © 2020-2023  润新知