一、TCP特性
尽管TCP和UDP都是用IP协议作为网络层,但TCP却提供和UDP完全不同的网络服务。TCP是面向连接的
、稳定可靠
的字节流
服务。TCP首部的很多字段都是为了实现这2大特性而设计的。
在一个TCP连接中,仅有两方能进行彼此通信。所以说广播和多播不适用于TCP协议。
为了通过IP数据报实现可靠性传输,需要考虑很多事情,如数据的破坏、丢包、重复以及分片顺序混乱等问题。TCP通过检验和、序列号、确认序列号、重发控制、连接管理以及窗口控制等机制来实现可靠性传输。
二、TCP协议首部
摘自《TCP/IP详解卷1》中的关于TCP首部定义的图:
TCP协议的实现较UDP协议复杂太多,它的首部的各个字段的用法也比UDP首部字段复杂多,这里先对TCP首部字段的功能做个大概的介绍。
- 16位源端口号:表示发送端端口号。传输层使用端口号来标识发送端和接收端的应用程序,而网络层是通过IP地址来标识主机,这样使用“IP地址+端口”就可以精确定位到某一台主机上的某一应用程序。
- 16位目的端口号:表示接收端端口号。
- 32位序列号:序列号用来标识从TCP发送端已经发送的字节数。达到最大值 232−1 2 32 − 1 之后,再从0开始。
- 32位确认序列号:确认序列号用来标识TCP接收端期望接收的下一个序列号(反过来想也就是,TCP接收端已经接受到的字节数为
确认序列号减去1
)。只有ACK标志位
为1时,该字段才有效。只要TCP连接建立,这个字段会一直起作用,也就是说只要TCP连接建立,ACK标志位
会一直为1。 - 4位首部长度:和IP首部一样,是以
4个字节(32 bit)
为单位的,所以TCP首部最大长度也是15*4=60
字节。若没有“选项”字段,长度固定为20字节。 - 6位标志位:他们中的多个可以同时被设置为1。
URG 标记后面的"16位紧急指针"是否有效。
ACK 标记前面的"32位确认序号"是否有效。
PSH 接收方应该尽快的将这个报文交给上层的网络层。
RST 重建连接。
SYN 标记这个TCP段是用来同步初始序号(ISN)的。
FIN 标记发送端已经完成了发送任务。
- 16位窗口大小:窗口大小为字节数,用于TCP的流量控制,这个值是接收端期望接受的字节数。
- 16位校验和:和UDP类似,校验和覆盖首部和数据部分。
- 16位紧急指针:只有前面提到的
URG
标记位为1时,这个字段才有效。 - 选项:添加一些附加数据。和UDP不同,TCP的“选项”字段使用的比较多。
《TCP/IP详解 卷1:协议》在线阅读地址:http://www.52im.net/topic-tcpipvol1.html