目录
一、TCP协议介绍
1. 定义
2. 特性
二、TCP报文格式
1. 图示
2. 报文选项注释
三、TCP三次握手
1. 定义
2. 图示
3. 过程
四、TCP四次挥手
1. 定义
2. 图示
3. 过程
五、UDP协议介绍
六、TCP/UDP协议区别
七、TCP的三次握手中为什么不是两次、四次?
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,提供全双工服务,即数据可在同一时间双向传输,但是速度较慢。
·工作在传输层
·面向连接协议
·全双工协议
·半关闭,断开
·错误检查(校验)
·将数据打包成段,排序(给数据排序)
·确认机制,对面每发一个包,会告诉对方已收到
·数据恢复,重传
·流量控制,滑动窗口,第一次握手后服务端会返回最最大可传输数量,在客户端进行及时调整
① 源端口、目标端口:计算机上进程之间通信是要通过计算机端口,每个进程在一定时间段内随机占用一个唯一端口,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,源端口个数和目标端口个数均为2^16个,即 65536 (0-65535)
② 序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0 开始无限循环
③ 确认号:(ack)表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。即ack=x+1
④ 首部长度/数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。数据偏移指 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
⑤ 保留:目前没有实际意义
⑥ 控制位:描述客户端和服务端两台设备目前的状态
·URG(紧急位):表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
·ACK(确认位):表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段
·PSH(急切位):提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
·RST(重置位):如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段
·SYN(同步位):在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
·FIN(断开位):表通知对方本端要关闭连接,标记数据是否发送完毕。如果FIN=1,传输完毕可断开连接,带FIN标志的TCP报文段称为结束报文段
⑦ 窗口大小:表示现在允许对方发送的数据量,从本报文段的确认号开始允许对方发送的数据量的峰值,需要ACK确认后才能再继续传送后面数据
⑧ 校验和:提供额外的可靠性紧急指针:标记紧急数据在数据字段中的位置
⑨ 紧急指针:指出本报文段中的紧急数据的字节数;
⑩ 选项:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节
在TCP协议中,通信双方将通过三次TCP报文实现对以上信息的了解,并在此基础上建立一个TCP连接,而通信双方的三次TCP报文段的交换过程,也就是通常所说的TCP连接建立实现的三次握手(Three-Way Handshake)过程。
注:seq序号,ack确认号,SYN同步位,ACK确认位
① 客户端主动发起请求报文,报文序号是随机产生的seq=x,并且报文中的控制位同步位SYN=1,代表请求建立连接
② 当服务端收到请求建立连接的报文会回复一个报文,其中会产生随机序号seq=y,生成一个确认号,值为客户端请求报文的序号+1,即ack=x+1,并且要求对方按照此序号进行确认回复。然后控制位同步位SYN=1,确认位ACK=1,表示同意建立连接
③ 当客户端收到同意建立连接的报文时会回复一个确认报文,会按照服务端要求产生的序号 x+1(seq=x+1), 再生成一个确认号,值为对方报文的序号+1 (ack=y+1),最后控制位确认位ACK=1,代表收到对方同意连接的请求
TCP的四次挥手是为了结束已建立的连接,确保双方都能正确地关闭连接并释放资源。
①(第一次挥手)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1(表示连接释放的请求),其序列号为seq=u(u-1是客户端发送的最后一个字节的序号)。此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
②(第二次挥手)服务器收到连接释放报文,发出确认报文,报文头包含:确认位ACK=1,确认号ack=u+1,序号seq=v(v-1是服务端向用户端发送最后一个字节的序号)。此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器会通知高层的应用,告知客户端到服务端这个方向的连接已经释放,这时候处于半关闭状态,数据依然可以传输到客户端,防止数据没有传输完毕。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
③客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,即最后数据。
④(第三次挥手)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,断开位FIN=1,确认号ack=u+1。由于在半关闭状态,服务器很可能又发送了一些数据,发送完毕后序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认回应。
⑤(第四次挥手)客户端收到服务器的连接释放报文后,必须发出确认,确认位ACK=1,确认号ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
⑥服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
UDP中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP协议传输速度快,但是不够稳定,没有重发机制。
协议 | 区别 | ||
TCP | 面向连接 | 稳定 | 速度慢 |
UDP | 无连接 | 不稳定 | 速度快 |
如果只有两次握手,至多只有客户端的起始序列号能被确认, 服务端选择的序列号则得不到确认。例如,客户端发送了一个建立连接的请求,但由于网络延迟或其他原因,该请求在传输过程中被延迟到达服务器。服务器此时会误认为客户端要建立连接,于是发送确认响应。然而,客户端近期实际并未发送过请求,因此不会回复确认。这样就会导致服务器一直等待客户端的回复,周期性重传,浪费资源。
通过引入第三次握手,可以解决上述问题。在第一次握手时,客户端发出建立连接的请求,服务器接收到后进行响应。并且生成指定序号要求客户端回应,即第二次握手。客户端按照服务端指定序号,再生成确认号,ACK=1,代表收到同意。
至于为什么不是四次握手,主要是因为虽然四次握手也可以实现可靠地同步双方的初始序列号,但由于第二步和第三步可以合并为一步,所以最终演变成了三次握手。而两次握手只能保证一方的初始序列号被对方成功接收,无法保证双方的初始序列号都能被确认接收。因此,三次握手是为了确保TCP连接的稳定性和可靠性而采取的最佳选择。
参考文献:两张动图-彻底明白TCP的三次握手与四次挥手_三次握手和四次挥手-CSDN博客