TCP/UDP数据报文发送的区别

image-20201219170704996.png

TCP协议为通信双方维持一个连接,并在内核中存储相关数据。这部分数据中的TCP头部信息和TCP内核缓冲区(发送或接收缓冲区)数据一起构成了TCP报文段,如上图虚线框所示。

当发送端程序使用send/write函数向一个TCP连接写入数据时,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP内核发送缓冲区中的数据,即TCP报文段。

而UPD无需为应用层数据保存副本,因为它提供的服务是不可靠的。所以当一个UDP数据包被成功发送之后,UDP内核缓冲区内的数据报就被丢弃了。如果程序检测到数据未被对方成功接收,并打算重新发送这个数据报,就只能重新从用户空间将该数据报拷贝到UDP内核发送缓冲区中。

socket

在内核中实现的协议,操作系统要实现一组系统调用,以便程序能够访问这些协议提供的服务。

上文提到,数据链路层、网络层、传输层协议是在内核中实现的。实现这组系统调用的API目前只讨论socket(XTI基本已经废弃)。

socket是一套通用网络编程接口,它不但可以访问内核中TCP/IP协议栈,而且可以访其他的网络协议栈。

socket定义的API主要提供两点功能:

  • 将应用程序从用户缓冲区复制到TCP/UDP内核发送数据缓冲区,以读取数据
  • 应用程序通过他们来修改内核中各层协议的某些头部信息或其他数据结构,从而精准地控制底层通信的行为。例如可以通过setsockopt函数来设置IP数据报在网络上的存活时间。