TCP协议与三次握手连接

1. 计算机网络体系结构

2. 运输层作用

  真正进行通信的实体是主机中的进程。从应用层看,只要把报文交给下面的运输层,运输层就可以把报文传送到对方的运输层,好像这种通信是沿着水平方向流动的,但是实际是经过多个层次传送的。

3. 运输层的两个主要协议

  运输层的两个主要协议是用户数据报UDP (User Datagram Protocol)协议和传输控制协议TCP(Transmission Control Protocol)

 

 

  UDP与TCP的区别:

 

4. 使用UDP和TCP的典型应用和应用层协议

 

5. TCP报文组成

 

  源端口和目的端口:各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能通过端口实现。

  序号: 占 4 字节,32位。TCP 连接中传送的数据流中的每一个字节都有一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。tcp协议拼凑接收 到的数据包时,根据seq来确定顺序,并且能够确定是否有数据包丢失。

  确认号:占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。若确认号 = N,则表明:到序号 N – 1 为止的所有数据都已正确收到。

  数据偏移(即首部长度):占4位,指出TCP报文的数据起始处距离TCP报文段的起始处有多远。单位是32位字(以4字节为计算单位)。

  紧急 URG:控制位。当 URG = 1 时,表明紧急指针字段有效,告诉系统此报文段中有紧急数据,应尽快传送 (相当于高优先级的数据)。

  确认 ACK:控制位。只有当 ACK =1 时,确认号字段才有效。当 ACK =0 时,确认号无效。

  推送 PSH (PuSH) :控制位。接收 TCP 收到 PSH = 1 的报文段后,就尽快(即“推送”向前)交付接收应用进程,而不再等到整个缓存都填满后再交付。

  复位 RST (ReSeT) :控制位。当 RST=1 时,表明 TCP 连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

  同步 SYN (SYNchronization) :控制位。

    同步 SYN = 1 表示这是一个连接请求或连接接受报文。

    当 SYN = 1,ACK = 0 时,表明这是一个连接请求报文段。

    当 SYN = 1,ACK = 1 时,表明这是一个连接接受报文段。

    终止 FIN (FINish) :控制位。用来释放一个连接。

    FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

  窗口:占 2 字节。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。

  检验和:占 2 字节。检验和字段检验的范围包括首部和数据这两部分。

  在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。

  紧急指针:占 2 字节。在 URG = 1时,指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),指出了紧急数据的末尾在报文段中的位置。

  选项:长度可变,最长可达 40 字节。

  填充:使整个 TCP 首部长度是 4 字节的整数倍。

6.  TCP三次握手建立连接

  所谓三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个报文。三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。如图所示:

  第一次握手:客户端向服务器发送连接请求的TCP报文,同步标志位SYN=1,确认标志位ACK=0,随机产生一个seq number=x的序号给服务器端。(SYN=1时,不能携带数据,但是要消耗一个序号)。此时客户端进入了SYN_SENT状态(即等待状态),等待服务器确认,并接受请求。

  第二次握手:服务端收到连接请求报文段后,查看同步标志位SYN=1,知道客户端请求建立连接,然后服务器端发送连接接受报文,此时同步标志位SYN=1,确认标志位ACK=1。确认号ack number=x+1(表明前面x数据包收到了,下一步从x+1序号发送报文),随机产生一个seq number=y作为初始序列号的同步确认报文。此时,服务器端进入SYN_RECV状态。

  第三次握手:客户端收到连接接受报文后,查看ack number=x+1,ACK=1。此时客户端会发送确认报文给服务器端,此时SYN=0,ACK=1,如果服务器端检查seq number=x+1,ACK=1,则建立连接成功,客户端与服务器端进入ESTABLISHED状态,完成三次握手,随后,客户端与服务器端可以开始传输数据了。

7.  三次握手好处

  • 为了防治服务器开启一些无用的连接,增加服务器开销。
  • 防止已失效的连接请求报文突然又传送到了服务端,而客户端又处于关闭状态,此时服务端会一直等待客户端发送确认信号。

8. TCP四次挥手

  第一次挥手:主动断开方(客户端,服务的都可以)向对方发送一个FIN结束请求报文,并设置序列号和确认号,随后主动断开方进入FIN_WAIT1状态,这表示主动断开方已经没有业务数据要发给对方了,准备关闭SOCKET连接了。

  第二次挥手:被动断开方收到FIN断开请求后会发送一个ACK响应报文,表明同意断开请求。随后被动断开方就进入CLOSE-WAIT状态(等待关闭状态),此时若被动断开方还有数据要发送给主动方,主动方还会接受。被动方会持续一段时间。主动方收到ACK报文后,由FIN_WAIT_1转换成FIN_WAIT_2状态。

  第三次挥手:被动断开方的CLOSE-WAIT(等待关闭)结束后,被动方会向主动方发送一个FIN+ACK报文。表示被动方的数据都发完了。然后被动方进入LAST_ACK状态。

  第四次挥手:主动断开方收到FIN+ACK断开响应报文后,还需进行最后确认,向被动方发送一个ACK确认报文,然后主动方进入TIME_WAIT状态,在等待完成2MSL时间后,如果期间没有收到被动方的报文,则证明对方已正常关闭,主动断开方的连接最终关闭。被动方在收到主动方第四次挥手发来的ACK报文后,就关闭了连接。

 

 

小结:本文对TCP协议作了简单介绍,对三次TCP握手进行了比较详细介绍。

 

  本文若存在错误或不足之处,欢迎指正与评论!

 

参考资料:

https://zhuanlan.zhihu.com/p/439614017            

https://zhuanlan.zhihu.com/p/430799766

https://blog.csdn.net/Li6682438/article/details/124431638

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-12-28 20:40  wancy  阅读(91)  评论(0编辑  收藏  举报