一. TCP面向字节流
创建一个TCP的socket,要同时在内核中创建一个发送缓冲区和接收缓冲区。
1.调用write时,数据会先写入发送缓冲区;
2.如果发送的数据字节数太长,就会被拆分成多个TCP的数据包发出;如若发送的字节数太短,就会在缓冲区等待,等到缓冲区长度差不多了,或者其他合适的时机才会发送出去;
3.接收数据时,数据也是从网卡驱动程序到达内核的接收缓冲区;
4.然后应用程序可以调用read从接收缓冲区拿数据;
5.TCP的一个连接,因为既有发送缓冲区,也有接收缓冲区,所以对于这一个连接,它既可以读数据,也可以写数据,读、写可以同时进行,这个概念叫做“全双工”
对于缓冲区的存在,TCP程序的读和写不需要一一匹配:即在写100个字节的数据时,可以一次调用write写100个字节,也可以调用100次write一次写一个字节;读数据的时候也一样。
二.粘包问题
1. 粘包的概念
(1)这里的“包”指的是应用层的数据包;
(2)在TCP的协议报头,没有类似与UDP的报文长度的字段,只有序号这样的字段,所以TCP的报文接收到接收缓冲区之后,只是按照序列排放整齐了;
(3)所以,站在应用层的角度,看到的只是一串连续的字节数据,所以应用程序只能看到数据,并不能知道哪一部分是一个数据包
2.如何