本文主要讲的是传输层的两大重要协议TCP和UDP,虽然在Android开发中,并不需要了解到这么底层,但有理论的支撑,写代码总是很自信的啦。理论指导着实践,实践是理论检验的唯一标准。站在巨人的肩膀窥伺网络世界。
用户数据报协议UDP
用户数据报协议UDP只在IP的数据报服务至上增加了复用和分用的功能以及差错检测的功能。只有面向无连接的报文,不可靠传输的特点。UDP对应用层交下来的数据只添加首部,并进行特别的处理,就交给网络层;对网络层传递上来的用户数据报拆封首部后,原封不动地交给应用层。
1、UDP的首部格式
用户数据报UDP分为两个字段:数据字段和首部字段,从图来分析用户数据报UDP的首部格式。
UDP首部字段很简单,由4个字段组成,每个字段的长度都是两个字节,共8字节。
- 源端口 原端口号,在需要对方回信时选用,不需要时可全0
- 目的端口 目的端口号,这在终点交付报文时必须使用,不然数据交给谁呢?
- 长度 UDP的长度,最小值为8字节,仅有首部
- 检验和 检测用户数据报在传输过程是否有错,有错就丢弃。
在传输的过程中,如果接收方UDP发现收到的报文中的目的端口不存在,会直接丢弃,然后由网际控制报文协议ICMP给发送方发送“端口不可达”差错报文。
2、伪首部
计算校验和时,需要在UDP之前增加12个字节的伪首部。这种首部并不是用户数据报的真正首部。伪首部并不在网络中传输,只是在计算检验和,临时添加在UDP用户数据报前,得到一个临时的用户数据报。
UDP的校验和是把首部和数据部分一起校验,发送方计算校验和的一般步骤:
- 将首部的校验和字段填充为0(零)
- 把伪首部和用户数据报UDP看出16位的字符串连接起来
- 如果数据部分不是偶数字节,则填充一个全零字节(该字节不发送到网络层)
- 按二进制反马计算出这些16位字的和
- 然后将和写入校验和字段,就可以发送到网络层了。
接收方收到用户数据报后,连同伪首部一起,按二进制反码求这些16位字的和,无差错结果是应全为1.否则出错,直接丢弃该报文。
TCP协议
TCP协议作为传输层主要协议之一,具有面向连接,端到端,可靠的全双工通信,面向字节流的数据传输协议。
1、TCP报文段
虽然TCP面向字节流,但TCP传输的数据单元却是报文段。TCP报文段分为TCP首部和数据部分,TCP报文段首部的前20个字节是固定的,后面有4*n字节根据需要动态添加的选项,最大长度为40字节。
- 源端口和目的端口 各占两个字节,TCP的分用功能也是通过端口实现的。