TCP的面向字节流&粘包问题&异常情况

一. 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.如何

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值