一.基本概念
1.TCP全名传输控制协议,是一种面向连接,确保数据在端到端之间进行可靠传输的协议。
2.面向连接:在连接前端与端之间建立一条虚拟的链路通道。
3.可靠传输:对数据的每一个字节进行编号,检验数据包的有效性,超时进行重传。
4.避免因网络恶化影响数据传输的手段:滑动窗口,拥塞控制。
二.TCP报头中的几个重要标志位
1.序列号(32位,即seq = ?):本报文段第一个字节的序号。
2.确认序号(32位,即ack = ?):期望收到的下一个报文段的第一个字节的序号。
3.SYN(Synchronize Sequence Numbers):用来建立连接时同步信号。(发送同步信号时将SYN置1)
4.ACK(Acknowledgement):用来对收到的数据进行确认,所确认的数据由确认序列号表示。(确认后将ACK置1)
5.FIN(Finish):用来表示后面已经没有数据了要发送了,所建立的连接需要关闭了。(要断开连接时将FIN置1)
三.三次握手(A机器与B机器建立连接时)
1.图解
2.步骤分析
(1)当A机器想要和B机器建立连接时,A机器首先要想B机器发送一个数据包,并将数据包中的SYN标志位置为1(建立连接时同步信号),假设SYN的值为x,即本报文段数据的第一个字节的序列号是x。
(2)B机器收到了A机器发来的数据包后,发现SYN标志位是1,就得知了这是一个建立连接的请求,于是向A机器发送了一个数据包,并且将SYN和ACK都置为1,表明向A机器发送同步信号,并且确认收到了A机器的数据包,最后假设这个数据包中seq为y,即本报文段数据的第一个字节序列号为y,ack(确认序号)为x+1,因为已经收到了A发来的x,x+1是下一个数据序号。注意:在TCP中,SYN被当作数据部分的一个字节。
(3)A机器收到了B机器发来的数据包后,需要再次向B机器发送响应包,并将ACK置为1,表示收到了B机器的数据包,并将ack(确认序号)设置为y+1,上一次B机器发来的为y,因此此次希望收到y+1。
3.为什么需要第三次握手?(重点)
两个目的:1.信息对等 2.防止超时
(1)信息对等:只有在第三次握手之后,B机器才能确定自己的发报能力和对方的收报能力是正常的。
(2)防止超时:防止超时就是为了防止出现请求超时导致脏连接。
解释:如果两次握手就能创建连接,那么释放连接后,有一个超时的连接请求可能才到达B机器,而B机器误以为又有机器来连接,然后B机器就会向A机器再次发送确认连接的数据包,而A机器此时的状态是Listening,不是SYN_SENT,因此A会将B的数据包丢弃,以至于B机器单方面创建连接。
四.四次挥手
1.图解
2.为什么最后A机器要等待2MSL?(重点)
(1)确认被动关闭方能够顺利进入CLOSED状态。
解释:加入最后A机器向B机器发送的数据包因网络超时B机器没有收到,那么B机器以为 A机器没有收到B机器发送的上一个FIN数据包,于是B机器向A机器重新发送FIN数据包,可是如果A机器不等待2MSL,A机器发送完最后的数据包就直接关闭了,有可能导致B机器无法正常关闭。
(2)防止失效请求
解释:防止已经失效的连接请求数据包与正常请求数据包混淆发生异常。
注意:TIME_WAIT = 2MSL是因为2MSL是报文在网络上生存的最长时间,超过就会被丢弃。