「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」
简介
TCP即传输控制协议,是一种面向连接的、可靠的、基于字节流的通信协议。简单来说TCP就是有确认机制的UDP协议,每发出一个数据包都要求确认,如果有一个数据包丢失,就收不到确认,发送方就必须重发这个数据包。为了保证传输的可靠性,TCP协议在UDP基础之上建立了三次对话的确认机制,即在正式收发数据前,必须和对方建立可靠的连接。TCP数据包和UDP一样,都是由首部和数据两部分组成,唯一不同的是,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。可以保证数据传输的可靠性。
TCP报文的头部结构
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
- ACK:确认序号有效。
- FIN:释放一个连接。
- PSH:接收方应该尽快将这个报文交给应用层。
- RST:重置连接。SYN:发起一个新连接。
- URG:紧急指针(urgent pointer)有效。需要注意的是:不要将确认序号ack与标志位中的ACK搞混了。确认方ack=发起方seq+1,两端配对。
三次握手🤝
三次握手的机制是为了保证能建立一个安全可靠的连接.
client为客户端,sever为服务端。
- 1、第一次握手🤝:客户端向服务端发起连接请求,此时服务端收到了,站在服务端的角度,说明客户端的发送能力没有问题,服务端的接收能力没有问题。此时完成第一次握手,客户端等待服务端反馈。报文段包含SYN标志位(也就是SYN=1),序列号seq=10000。
- 2、第二次握手🤝:在服务端发现SYN=1,知道这是一个连接请求,于是将客户端的起始序列号10000存起来,并且随机生成一个服务端的起始序列号(比如是20000)。然后给客户端回复一段报文,回复报文包含SYN和ACK标志(也就是SYN=1,ACK=1)、序列号seq=20000、确认号ack=10001(客户端发过来的序列号+1)。如果客户端能收到,站在客户端的角度,说明客户端的发送能力、接收能力都没问题,服务端的发送能力、接收能力也没有问题。站在服务端的角度,说明客户端的发送能力没问题,服务端的接收能力也没有问题。但是这时服务端不知道自己的发送能力以及服务端的接收能力是否有问题。不能完全保证连接成功,所以发生第三次握手。
- 3、第三次握手🤝:客户端收到服务端的回复后发现ACK=1并且ack=10001,于是知道服务端已经收到了序列号为10000的那段报文;同时发现SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号20000给存下来。然后客户端再回复一段报文给服务端,报文包含ACK标志位(ACK=1)、ack=20001(服务端序列号+1)、seq=10001(第一次握手时发送报文是占据一个序列号的,所以这次seq就从10001开始,需要注意的是不携带数据的ACK报文是不占据序列号的,所以后面第一次正式发送数据时seq还是10001)。当服务端收到报文后发现ACK=1并且ack=20001,就知道客户端收到序列号为20000的报文了,就这样客户端和服务端通过TCP建立了连接。通过第三次握手,服务端知道自己的发送能力没有问题,服务端的接收也没有问题。可以创建连接。
总结
通过以上三次连接,不管是客户端还是服务端,都知道既能给对方发送消息,也能收到对方的响应。那么,这个连接就被安全的创建了。