»
(008) CubeIDE Implementation of USB Peripherals*
(018) C99 pointer*
(019) C99 With only value assignment*
(022) POSIX pthread multi-threads mutex*
(023) POSIX pthread multi-threads programming*
(027) C99 time and wait*
(028) High-precision calculation with GMP*
(029) Web Service Lib*
(030) International Components for Unicode (ICU)*
(031) Performance of C is higher than C++, because...*
(033) MTU TCP SOCKET
以下为本人对流式传输的描述
SOCKET是流式传输,阻塞模式send函数直到全部数据片段发送完成、对端存住最后的数据片段后返回;非阻塞模式只拷贝数据到socket缓冲区、缓冲区还能存多少返回值就是多少,非阻塞模式send一次的数据量不固定。
对socket发送缓冲区中的数据进行分段地发送,每次发送就是一个TCP数据段,TCP可以单独发送请求快速处理(PUSH)和响应多个数据段的确认接收(ACK)。每个TCP段的发送都会有一次数据校验。一个数据段的大小由滑动窗口大小、最大传输单元(MTU,Maximum Transmission Unit)来确定。其中,MTU在局域网中最大就是1518字节,而在互联网中最小68字节。
所以,TCP是流式的可靠传传输,它的每个滑动窗口、也就是每个数据段都会做奇偶校验以及得到ACK的确认。
非阻塞模式:
1、非阻塞模式send只是把应用层的数据拷贝进socket的内核发送缓冲区中,然后立即返回。如果IP层发送数据发生错误则会体现在下一次send调用过程中。
2、非阻塞模式send的返回值length可能小于实际传入的数组数据的大小,因为socket内核发送缓冲区大小有限。最大只能是8k。
3、对于接收,对端发来的数据都会经由内核接收并且缓存到socket的内核接收缓冲区之中,供应用层read方法的读取。read所做的工作,就是把内核缓冲区中的数据拷贝到应用层用户的buffer里面。所以,对于非阻塞模式的每一次read,read获得的数据量也不能确定。
4、以上不确定长度的发送数据流和不确定长度地接收数据流只发生在物理网速特别慢、MTU特别低的时候,非阻塞send会存入部分数据到socket内核缓冲区。否则,网速足够的话、要求发送的数据内容小于MTU的话、接收端处理速度足够快的话,在发送端,缓冲区一旦有数据,数据就会被发送到对端接收端、被接受、并被送到应用层处理。
所以,遇信号干扰、网速不够、发送缓冲区挤满,注意编程模式:要发送8k字节而实际2k字节、6k字节地发送的非阻塞流式数据传输模式。
不论什么模式,记得:
TCP中是数据段,UDP中是数据报文