tcp三次握手

在进行tcp三次握手讲解之前先需要先认识tcp报文段首部的几个字段及其他们的作用

1、 ACK 只有当ACK置1时 ack确认号才有效

2、 SYN 在建立连接时用来同步序号,当SYN=1,ACK=0时表明这是一个请求报文段

3、 FIN 终止  当FIN为1时表名此报文段的发送方数据已经发送完毕,并且请求释放连接

SYN和FIN的作用相似只是一个用于请求连接,一个用于请求释放连接

4、 ack(确认号) 期望收到对方下一个报文段的序号,同时也说明自己已经收到的报文段序号,例如:ack=x+1;表示期望收到的下一个报文段的序号为x+1,并且序号为x的报文段已经收到。

5、 seq序号,因为tcp是面向连接的传输方式,通过序号可确认是否有数据丢失,表示当前报文段的序号。

三次握手

先大体描述整个过程:

一、 客户端请求连接

二、 服务端收到请求,并发送确认

三、 客户端收到确认并向服务端发送确认

为什么需要第三步:如果只有前面两个步骤的话会存在这样一种情况:客户端发送请求后久久没收到服务端的确认(但请求消息依然是在网络中的),所以就主动断开了这次连接,过了一段时间后服务端收到请求,就会一直等待客户端发送数据,而实际上客服端已经断开了连接,这样就会造成服务端资源的浪费。

下面是具体的一个过程:每个过程与上面是相对应的

一、客服端将TCP报文段的首部的 SYN置1,ACK依然为零,同时seq=x(x为随机产生的数)将该TCP报文段发送给服务端,此时客户端进入SYN-SENT(同步已发送)状态。该报文段是不能携带数据的,但依然消耗掉一个数据。

二、服务端收到该报文段后知道这是一个请求报文,所以就将TCP首部中 SYN置1,ACK也置1(需要确认),同时seq=y(y也是随机产生的),ack=x+1,表示自己已经收到序号为x的报文段期望下次收到的报文段的序号为x+1。服务端就进入SYN-RCVD(同步收到)状态。该报文段也是不能携带数据的,但依然消耗掉一个数据。

三、客服端收到报文段后将自己的TCP报文段的首部的ACK置1(需要确认),同时ack=y+1,(说明已经收到服务端序号为y的报文段,希望下次收到的报文段为y+1),同时seq=x+1;客户端进入ESTABLISHED(已建立连接)状态

服务端收到确认后也进入了ESTABLISHED(已建立连接)状态。

心有多大,天有多高,一起奋斗!!
原文地址:https://www.cnblogs.com/zhaolei1996/p/10737492.html