头号码甲的错题本

头号码甲的错题本

  • OSI open-system-Interconnection
  • TCP/IP 5层协议栈
    • 应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api
  • TCP/UDP 概况
  • TCP粘包问题
  • TCP/IP报头深思

OSI开放系统互联

定义了网络框架,以层为单位实现协议,同时控制权逐层传递。
粘包/拆包问题一直都存在,只是到TCP就拆不动了。-LMLPHP

OSI实际并没有落地,TCP/IP 5层协议栈是目前主流的落地实现

TCP/IP 5层协议栈

不管是OSI还是TCP/IP5层协议栈,均会出现应用程序和操作系统边界(代码执行在用户态/内核态)。

粘包/拆包问题一直都存在,只是到TCP就拆不动了。-LMLPHP

边界调用被称为系统调用system callsocket api便是TCP/IP协议栈中应用层的网络编程接口。

TCP/UDP概览

  • TCP: Transmission Control Protocol面向连接的,可靠的,基于字节的、双向流式传输层协议。

  • UDP: USer Datagram Protocol面向消息的传输服务,传输的数据是有边界的。
    区别:

TCP可靠性是tcp三次握手的基础,在此之上,增加了seq、ack数据确认机制、 拥塞控制, 其中ack= seq+len(data)。

UDP: 想法就发,不用三次握手建立连接。

我们目前常见的应用场景底层都是tcp,比如http请求、sql数据库请求。

建立TCP连接之后,才能做http请求、sql请求,tcp连接很耗时,故服务器都存在连接池化机制。

TCP粘包/拆包

TCP粘包并不是TCP协议造成的问题,因为tcp协议本就规定流式传输(由算法决定,固定缓冲区、拥塞控制、大小包合并),它不含消息、数据包等概念,需要应用层自己设计消息边界。

粘包/拆包问题一直都存在,只是到TCP就拆不动了。-LMLPHP

粘包/拆包问题一直都存在,只是到TCP就拆不动了。-LMLPHP


HTTP 超文本传输协议的规定如下:

粘包/拆包问题一直都存在,只是到TCP就拆不动了。-LMLPHP

附录: ip报头结构:[源ip、目标ip在这定义]

粘包/拆包问题一直都存在,只是到TCP就拆不动了。-LMLPHP

旁白

梳理了整个TCP/IP协议栈的流程,结合TCP报头/IP报头, 我们就知道粘包、拆包一直都存在,只是拆到TCP层的时候,我们没有办法区分应用层断续发送的请求/调用, 这就是我们口口相传的TCP粘包/拆包问题, 需要应用层用特殊分隔符或者长度解析。

05-09 20:12