程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

简单了解TCP三次握手的过程(tcp三次握手过程图)

balukai 2025-02-03 11:21:16 文章精选 6 ℃

不是计算机专业的,工作几年,今年公司要倒闭了,准备准备面试了,看看面试题。今年工作好难找。年轻的找的都挺快的,年纪大点的公司好像都不想要了。

传输控制协议TCP简介

  1. 面向链接的,可靠的,基于字节流的传输层通信协议
  2. 将应用层的数据流分割成报文段并发送给目标节点的TCP层
  3. 数据包都有序号,对方收到则发送ACK确认,未收到则重传。
  4. 使用校验和来检验数据传输过程中是否有误



TCP报文头



1、端口号:在传输层中使用协议端口号 ip层的IP地址可以唯一标识主机,TCP协议和端口号可以标识主机中的唯一进程。这样可以用IP地址+端口号+协议标识网络中的一个进程,这种唯一标识的方式也称为套接字。也叫socket。也就是说通信的重点是应用层但我们只要把报文传递到某一个端口,剩下的就交给TCP来完成即可。

TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

2、序号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号,在TCP传送的字节流中每个字节是按照顺序编号的,例如一段报文中序号字节是100,报文数据共有200个字节,则下一个报文的序号为300,所以序号确保了传输的有序性

3、确认序号:即ACK,指明下一个期待收到的字节序号,表明序号之前的所有数据已经正确无误的收到,例如B接收到A序号为100长度为200的报文,那么确认序号就为301,表示之前的数据已经成功收到。

4、数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4为首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。

5、保留:为将来定义新的用途保留,现在一般置0。

6、控制位: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时表示发送方已经没有数据发送了,即关闭本方数据流。

7、窗口:滑动窗口大小,用来告知发送端接收端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。

8、校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。

9、紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

10、选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。

10、数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。




TCP三次握手

当一个应用程序想要与另外一个应用程序想要通讯时会发送一个通讯请求。这个请求必须被发送一个确切的地址,在握手之后TCP会建立一个全双工的通讯。



这里客户端为A 服务器为B 一般服务器都是打开端口进行监听的。

握手之前主动打开连接的客户端结束CLOSED阶段,被动打开的服务器端也结束CLOSED阶段,并进入LISTEN阶段。随后开始“三次握手”:

  1. 标记位SYN=1表示 A现在请求建立新连接,接着初始化序号为X(一个整数,一般为1),然后客户端进入了SYN-SENT阶段(对服务端喊话,我想建立连接)
  2. 服务器收到了来自客户端的TCP报文后,结束了LISTEN阶段。并返回一段TCP报文,标志位SYN和ACK,表示确认客户端的报文seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接(回复客户端,服务器收到了数据) 然后 服务器返回序号seq=y,确认号ACK=x+1表示收到客户端的序号,并将其值加1作为自己的确认号ACK的值,然后服务器进入SYN-RCVD阶段
  3. 客户端收到了服务端返回的确认收到数据的TCP报文后,明确了从客户端到服务器的数据时正常传输的,结束SYN-SESNT阶段,并返回最后一段TCP报文,其中,标志为ACK 表示确认收到服务器同意连接的信号(客户端通知服务器,你发的数据我也收到了),序号为seq=x+1 ,表示收到服务器段的确认号ACK,并将ACK作为自己的序号值,确认号ack=y+1,表示收到服务器端序号seq,并将值加1作为自己的确认号ACK的值,随后客户端进入ESTABLISHED阶段

服务器端收到客户端传输的TCP报文后,明确了从服务器到客户端的数据传输是正常的,结束SYN-SENT阶段,进入ESTABLISHED阶段

在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成。

此后客户端和服务器端进行正常的数据传输。这就是“三次握手”的过程。

三次握手”的通俗理解

男孩喜欢女孩,一天,男孩给女孩写封信,我喜欢你,咱们谈恋爱吧,然后把信寄了出去,男孩在家焦急的等着回信,

女孩收到了男孩的信,心花怒放,原来你也喜欢我,然后立刻写信给男孩,你的信我收到了,我也喜欢你,我们交往吧。女孩把信寄给了男孩。女孩在家焦急的等待着。

男孩收到女孩的信,内心欢喜从回信中得知,自己的信女孩收到了,并且女孩也喜欢自己。哈哈,还愿意和自己交往,然后写了一封信给女孩,你的信我收到了。我们交往把。

女孩收到了回信后,知道发送的情书男孩收到了从此以后男孩女孩过上了没羞没早的日子了。这就是通俗的三次握手,期间一同三封信,也就是三次握手双方都互相了解了对方的想法。正式开始交往了。

三次握手可以保证服务器开启的连接是有效的,可以过了掉服务器的一些无用连接,减少服务器的开销,又能防止一些已经失效的连接的请求报文,忽然传到了服务端,从而缠手了粗欧文

Tags:

最近发表
标签列表