为什么TCP是面相字节流的?
TCP和UDP的区别
其实这个标题可以改为 【TCP和UDP的区别】
我们知道TCP只能进行一对一的传输,而UDP则可以进行一对一、多对多、一对多、多对一传输,主要原因就是TCP会建立虚拟通道建立一个连接来保证数据包的可靠传输,数据包丢了必须进行重传
UDP就不需要保证可靠传输,只要把数据封装为UDP报文填上目标的IP+端口
发送出去就行,其它的都交给网络了,不管到没到。
所以一个主机可以发送UDP包给任何的主机而不需要提前建立连接,如果目标主机有监听这个端口那么就可以接收到数据,没有监听则会把这个包丢掉
同理一个主机也可以接受来自任意主机的UDP报文,只需要监听着端口等待数据即可
所以UDP报文其实只是相当于给IP报文加上了个IP+端口而已,继承了IP包、以太网数据帧的特性,不管网络拥塞不拥塞只要应用层有数据就发送,而TCP报文就复杂了,需要记录各个信息,这些信息都是一些维护连接,控制流量的一些信息
TCP是面相字节流的,而UDP是面相报文的
这句话估计已经耳熟能详倒背如流的,那么什么是面向字节流呢?什么是面相报文呢?
什么是面相字节流
字节流可以理解为水流,TCP连接会建立一个虚拟通道(其实就是双方维护连接的数据结构,发到哪了收到哪了下面该发那段数据了),建立通道之后这样就只能一对一的进行可靠传输了,TCP会将应用层的数据看成是一个无结构的字节流数据,简单来说就是没头没尾
如果应用层传递下来的数据太少则TCP可以等一等,积累一些数据再封装为一个TCP包发送,这样就提高传输的效率,因为如果数据大小都比TCP报文头的数据还小这样传输数据的效率是不划算的,这样将就会将应用层传递下来的多个数据合并为一个TCP包进行传输
如果应用层传递下来的数据太多,那么TCP就会拆分为多个TCP报文进行传输,因为TCP报文有一个MSS
规定了报文的最大大小 ,这个值和以太网的MTU
大小有关,如果一个TCP报文不规定合适的MSS
那么可能会被拆分为多个IP包进行传输,这个就会增加IP包拆分和组装的消耗,所以MSS
应该和MTU
大小接近不能超过这个值
每次发送的数据包大小都是不一致的,这个和网络状况以及对方的数据接受能力有关,也就是滑动窗口和拥塞控制窗口
什么是面相报文
UDP是面相报文的,UDP将应用层数据看作是一个有头有尾的完整的数据包,
也就是说不管应用层传递下来多少数据,多大的数据,UDP都会封装为一个完整的数据包发送出去
接收端也不管接受到了多大多小的UDP数据包都不会进行拆分和组装,而是完整的将UDP报文数据上交给应用层
总结
总的来说,TCP是以一次连接的建立和断开为单位进行传输数据的,在连接还没有断开之前一直可以往这个通道里传输数据流,并且不知道这个连接什么时候断开,只有当应用层通知连接可以关闭即开始4次握手断开连接,连接建立代表数据开始传输,连接结束代表数据传输完毕,所以说TCP是面相字节流
UDP则以一次数据包的发送接受为单位,只要应用层传递下来数据,UDP就封装为一个完整的UDP数据包发送出去,此时就可以表示此次的发送已经完成,后面的发送都是独立和无关的都代表着一次UDP连接发送