[Socket编程]对TCP数据传输有几点疑问

明白了,你说的是tcp报文,确切的说是ip承载的tcp报文,这个确实是一包一包的。tcp宣称的所有特性都说的是它对外提供的服务,比如可靠传输、面向连接、数据流传输等,而不是他自身天生就是如此,他也要利用上层操作系统接口,下层ip层的一些特性来实现。手机码字,就不举例子了。

其实面向连接更扯,完全是接口层提供的特性,所以有udp的连接跟踪技术

本论坛真是一个奇怪的地方,各种疑难杂症都有可能在这里找到答案,但关于tcp这样的几乎是常识性的问题,却讨论的如此尴尬。。。

学艺不精,只好向各位多问问 :slightly_smiling_face:

不要误解,我不是针对提出问题的人。

  1. 这个数据传输其实和HTTP没什么关系,和TCP/IP有关。
  2. 当数据包过长时,TCP会自动拆包编号。也就是说在你看来的一个数据包,实际传输中可能拆成n个,在接收端再按序号重组成发送的样子。 每次实际传输的长度,是IP层的total_length - TCP层的 header_length。(如果我没记错的话)

感兴趣可以看下TCP/IP详解

1 个赞

不奇怪,emacs用户成份复杂,并不都是出生计算机专业,学医的,学管理的都有:-)

原来是这样,蟹蟹指点

  1. tcp底层会对数据进行分片编号,每个块大小受到路径最小MTU限制,一般为1500,也有1450的。至于同步异步io,这是操作系统提供的功能,不是重点。
  2. 普通的接受端收到的数据虽然我们将其当成一个流,但是如果实时读取的话还是一块一块的,也就是1500的大小,如果发送的数据小于这个值,不用考虑分片。如果大于这个值则会收到多个块。
  3. http协议有分为 http header 和 http response. contentlength是值得数据长度,不包含header。所以实际上并不能确定一个http的实际长度,因为http协议实际上都是明文传输,都是ascii码,所以header部分是收到一个空行作为结束,剩下的内容为content-length表示的数据。所以需要用到流处理逻辑, 也有定长处理。
  4. 你说的封装字节流,是比较通用的做法,不过这个涉及到帧定义,首部定义,字节对齐各种考究。你这个太简单了。例如我们可能封装成下面这样, 要有明确的字节属性。
struct buffer {
  uint_8 version;
  uint_8 length;
  char[] data;
}