计算机网络漫谈之传输层 咱们讨论了如果需要确定一个计算机上的不同网络程序(比如QQ和浏览器),需要端口的标识,但是IP头部和帧的头部都没有端口的标识字段,需要新的协议。和前面IP协议的实现套路一样,我们需要一个空间来存放端口号,因此就有了传输层的协议TCP和UDP。最简单的实现就是UDP协议,它的格式几乎就是在数据前面,加上端口号。UDP数据包,也是由”标头”和”数据”两部分组成。
“标头”部分主要定义了源端口和接收端口,”数据”部分就是具体的内容。具体的Head结构如下所示:
然后,把整个UDP数据包放入IP数据包的”数据”部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样:
目前我们的数据包更加完善了,也更加能体现层层封装的意思。绿色头部是UDP头部,红色头部是IP头部,蓝色头部是帧的头部,”上层标头+数据”作为下层的数据。
UDP协议的优点是比较简单(它的数据包包头几乎只有端口和长度),容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。
因此,TCP协议能够确保数据不会遗失。它的缺点是过程复杂(TCP三次握手、四次挥手等)、实现困难(数据重传机制、流量控制机制等)、消耗较多的资源。TCP数据包和UDP数据包一样,都是内嵌在IP数据包的”数据”部分。TCP数据包也是由“标头”和“数据”组成的。当然,“标头”是重点。下面我们一起来看看TCP数据包的“标头”:
明显比UDP的数据包“标头”复杂多了,我们下面来依次解释每个字段的含义。我尽量以最简单的方式来解释每个字段,目前你大概知道是干什么的就行了:
- 源端口与目的端口: 各占16位,分别写入源端口号和目的端口号。
- 32位序列号: 占32位,能唯一标识一次通信中的数据包序号,可以看作是一个数据包的ID。
- 32位确认序列号: 占32位,作为确认收到使用,比如如果想确定上面32位序列号,就把此值填为其值加1。
- 首部长度: 占4位.表示整个“标头”的长度,所以TCP报头最大为60字节。
- URG: 占1位,紧急指针标志位,当URG=1时,表明紧急指针字段有效.它告诉系统中有紧急数据,应当尽快传送,这时不会按照原来的排队序列来传送.而会将紧急数据插入到本报文段数据的最前面。
- ACK: 占1位,当ACK=1时,确认序列号才有效,当ACK=0时,确认序号ack无效。
- PSH: 占1位,推送操作,很少用,没有了解。
- RST: 占1位,当RST=1时,表明TCP连接出现严重错误,此时必须释放连接。 (9)SYN: 占1位,请求连接的标志。
- FIN: 占1位,释放链接的标志.
- 16位窗口的大小:占16位,表示期望对方发送的字节数。
- 16位检验和: 占16位,用于检验包数据是否正确。
- 紧急指针: 占16位,只有当URG=1时的时候,紧急指针才有效,它指出紧急数据的字节数。