TCP 协议三次握手
本文最后更新于 2024-04-01,欢迎来到我的Blog! https://www.zpeng.site/
TCP 协议三次握手
1.介绍
下图为 TCP 头部的结构。
TCP,全称 Transmission Control Protocal。从名字可以知道这是一个用于 控制传输 的位于传输层的协议。
TCP 位于 TCP/IP 和 OSI 模型的传输层。我们最常使用的 HTTP 协议,底层通常使用的就是 TCP 协议。
如果要在客户端和服务端创建 TCP 连接,我们需要在开始的时候发送三个请求确认双方的通信能力正常,这三次连接就被称为 TCP 的三次握手。
1、端口号:用来标识同一台计算机的不同的应用进程。
1)源端口:源端口和IP地址的作用是标识报文的返回地址。
2)目的端口:端口指明接收方计算机上的应用程序接口。
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。
2、序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
3、数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
4、保留:为将来定义新的用途保留,现在一般置0。
5、控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。
1)URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
2)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
3)PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
4)RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
5)SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
6)FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。
6、窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
7、校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
8、紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
9、选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
10、数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
2.三次握手
1.第一次握手:
客户端给服务端发送一个 TCP 报文。在 TCP 头部中:
将 SYN 标志位设置为 1;
然后给 seq 赋予一个随机数(假设这个随机数是 x)
所谓标志位,其实就是一个比特的数据,设置为 1 ,其实就类似编程中将一个布尔值设置为 true。
SYN 代表同步(sync)的意思,seq 是序列号(Sequence number)的意思,是一个可以装载数值的地方,我们给它设置为随机数,是用来做凭证(token)的,稍后服务端会使用它。
2.第二次握手:
服务端收到 SYN,知悉客户端希望建立 TCP 连接,并拿到了一个 seq 随机数。
服务端于是向客户端发送 TCP 报文,TCP 头中:
将 ACK 标志位设置为 1,表示已知悉(acknowledge)客户端的连接请求;
ack 的值设置为客户端传过来的 seq 值 + 1(即 x+1);
将 SYN 标志位设置为 1,表示服务端也要连接;
seq 的值设置一个随机数(假设随机数为 y)
服务端通过 ACK 和 ack 来告知客户端已知悉连接请求,并发送自己的 SYN 和 seq 来请求和客户端的连接。
3.第三次握手:
客户端收到 TCP 请求,首先验证 SYC 是否为 1, seq 是否为 x+1。
如果是,说明服务端的这个发送是对应第一次握手的返回。客户端会再发送一个 TCP 请求:
ACK 设置为 1;
ack 设置为服务端 ack 的值 + 1(即 y + 1)
三次握手后,TCP 连接就建立了。
完成三次握手,客户端与服务器开始传送数据,
3.抓包(Wireshark)
以连接阿里云服务器为例
本机:IPv4 地址 . . . . . . . . . . . . : 192.168.1.101
阿里云服务器:60.205.124.168
过滤器:ip.addr == 60.205.124.168
筛选出源 IP 或者目的 IP 地址是 60.205.124.168 的全部数据包
1.第一次握手:
192.168.1.101到60.205.124.168
SYN=1,ACK=0,(seq number= x)seq number=0(相对),294663901(原始)
2.第二次握手:
60.205.124.168到192.168.1.101
SYN=1,ACK=1,(ack =x+1)ack=1,294663902 ,(seq number= y)seq=0(相对),3824765142(原始)
3.第三次握手:
ACK=1、(y+1)ack=1,3824765143
- 感谢你赐予我前进的力量