TCP入门与实例讲解

TCP是TCP/IP协议栈的核心组成之一,对开发者来说,学习、掌握TCP非常重要。

本文主要内容包括:什么是TCP,为什么要学习TCP,TCP协议格式,通过实例讲解TCP的生命周期(建立连接、传输数据、断开连接)

TCP简介

传输层控制协议(Transport Control Protocol),TCP/IP协议栈的核心之一。位于应用层与网络层之间,提供面向连接的、可靠的字节流服务。

记住关键词“面向连接”、“可靠”、“字节流”,这是学习掌握TCP的关键:

面向连接:客户端、服务端交换数据前,需要建立连接;

可靠:通过特定机制,在不可靠的网络之上,确保报文准确送达,

字节流:数据的最小单位为字节。至于字节中存储内容的含义,由于应用层的程序决定。

TCP入门与实例讲解

TCP如何确保服务可靠性

TCP花了大量的功夫在确保传输层服务的可靠性上,具体举措包括(但不限于)以下:

应用数据切割:应用数据被分隔成TCP认为最适合发送的多个报文段(由特定的算法和机制来确认)

接收端确认:接收端收到报文段后,会向发送端发送确认报文;

超时重传机制:发送端发送一个报文段后,会启动定时器,等待接收端确认收到这个报文;如果没有及时收到确认,发送端会重新发送报文;

数据校验和:发送端发送的报文首部中,有个叫做校验和(checksum)的特殊字段,它是根据报文的首部、数据计算出来的。这是一个端到端的校验和,用来检测传输过程数据的变化。接收端收到报文后会对校验和进行检查,如果校验和存在差错,则丢弃这个报文,且不确认收到此报文(等待发送端超时重发)

报文段排序:TCP报文包裹在IP数据包里进行传输,而IP数据包的到达次序是不固定的。接收端会对接收到的报文段重新排序,这个对应用层是无感知的;

去重复:接收端丢弃重复的报文(比如,因某些原因,虽然接收端已经收到报文,且给发送端发送了接收确认,但接收端没有收到该确认,超时后重新发送了同样的报文);

流量控制:TCP连接双方都有固定大小的缓冲空间,且只允许发送端发送缓冲空间能够容纳的数据,避免缓冲区溢出;

TCP传输服务的可靠性对应用层的开发者来说至关重要。作为应用层的开发者(比如HTTP server),除了业务逻辑之外,如果还需要操心数据是否正常送达,接收到的数据是否完整,开发效率会相当低下。

参考自《TCP/IP详解卷一》,推荐阅读

TCP首部格式

TCP首部格式如下图所示,在不包含可选字段的情况下,大小通常为20个字节。部分字段定义可能并不直观,如果读者觉得某些首部字段不好理解,建议先跳过,结合后文的实例可能更容易理解些。

比如 Sequence Number/Acknowledgment Number/ACK/SYN,结合TCP建立连接的过程来看,会更好理解。

这里留个小问题给读者:怎么知道TCP报文段数据(data)的长度是多少?

TCP入门与实例讲解

Source Port(来源端口):16位

Destination Port(目的端口):16位

Sequence Number(序号):32位

TCP报文段中的数据部分,每一个字节都有它的序号(递增)。根据控制标志(Control Bits)中的SYN是否为1,Sequence Number 表达不同的含义:

SYN = 1:当前为连接建立阶段,此时的序号为初始序号(ISN)。当数据传输正式开始时,数据的第一个字节的序号为 ISN + 1;

SYN = 0:当前报文段中,数据部分的第一个字节的序号。

Acknowledgment Number(确认序号):32位

当控制标志的ACK为1时,表示发送方希望收到的下一个报文段的序号(Sequence Number)。一旦连接建立成功,ACK值一直为1。

Data Offset(数据偏移量):4位

TCP报文段的首部长度,单位是word(4字节)。字面含义是:TCP报文段的数据的起始处,距离TCP报文段的起始处 的偏移量。4个字节最大能表示的数字是15,所以首部最大60字节。

Reserved(保留字段):6位

预留作为后续用途,必须是0。

Control Bits(控制标志):6位

一共有6个控制标志,其中SYN/ACK、FIN/ACK主要用于连接的建立、断开阶段。

URG: 当置为1时,表示紧急指针(Urgent Pointer)字段有效;

ACK: 确认序号字段(Acknowledgment Number)有效;

PSH: 接收方应立即把这个报文段交给应用层;

RST: 重建连接;

SYN: 同步序号,用于建立连接;

FIN: 发送端不再发送数据;

Window Size(窗口大小):16位

允许对方发送的数据量。告诉对方自己缓冲区还能容纳多少字节,用来控制对方发送数据的速度。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyydjx.html