当tcp发送一个段后,开启定时器(500ms慢定时器),超过rto没有收到确认的话,重发该段。
当tcp收到另一端发来的数据后,等待几分之一秒的时间,这段时间校验数据,如果有错误则丢弃,等待发送端超时重发。
TCP头默认20字节,并可由4位首部长度指定。
IP地址(IP头部中)加端口号(TCP头部中)可以唯一确定一个连接。
建立连接时,SYN置1,。当ACK置1时,32位确认号才有效。
建立连接三次握手,关闭连接四次握手。
(1)客户端:客户端发送SYN报文段,并且顺序号为x
(2)服务器端:服务器端接收到,并且返回一个SYN报文段,顺序号y,确认号ack=x+1
(3)客户端:收到报文,并返回ack=y+1,此时客户端建立连接
(4)服务器端:收到确认,建立链接。
(1)客户端:上层应用进程关闭,发送完所有未处理的报文段后,发送Fin报文段,顺序号为x,并且不再接收应用的数据。
(2)服务器端:接收到Fin报文段,返回ack=x+1确认,并且通知上层应用,对方上层已关闭。
(3)客户端:收到确认报文段。
(4)服务器端:上层应用关闭,发送Fin报文段,顺序号为y,确认号为x+1
(5)客户端:接收Fin报文,并返回确认号ack=y+1
(6)服务器端,接收报文段。
收到本方应用进程的关闭命令后,TCP在发送完尚未处理的报文段后,发FIN=1的报文段给对方,且TCP不再受理本方应用进程的数据发送。在FIN以前发送的数据字节,包括FIN,都需要对方确认,否则要重传。注意FIN也要占一个顺序号。一旦收到对方对FIN的确认以及对方的FIN报文段,本方TCP就对该FIN进行确认,在等待一段时间,然后关闭连接。等待是为了防止本方的确认报文丢失,避免对方的重传报文干扰新的连接。
客户端TCP状态迁移:
CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
服务器TCP状态迁移:
CLOSED -> LISTEN -> SYN_RECEIVED -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED
(1)CLOSED 状态时初始状态。关闭状态,没有连接活动或正在进行
(2)LISTEN:被动打开,服务器端的 状态变为LISTEN(监听)。
被动打开的概念:连接的一端的应用程序通知操作系统,希望建立一个传入的连接。这时候操作系统为连接的这一端建立一个连 接。
与之对应的是主动连接:应用程序通过主动打开请求来告诉操作系统建立一个连接。
(3)SYNRECVD:服务器端收到SYN后,状态为SYN;发送SYN ACK;
(4) SYN_SENTY:应用程序发送SYN后,状态为SYN_SENT;
(5)ESTABLISHED: SYNRECVD收到ACK后,状态为ESTABLISHED; SYN_SENT在收到SYN ACK,发送ACK,状态为ESTABLISHED;
(6)FIN_WAIT_1:(主动关闭)应用程序端发送FIN,准备断开TCP连接;状态从ESTABLISHED——>FIN_WAIT_1;
(7)FIN_WAIT_2:(主动关闭)应用程序端只收到服务器端的ACK信号,并没有收到FIN信号;说明服务器端还有数据传输,那么此时为半连接;
(8)TIME_WAIT:有两种方式进入 该状态:
1、FIN_WAIT_1进入:此时应用程序端口收到FIN+ACK(而不是像FIN_WAIT_2那样只收到ACK,说明数据已经发送完毕)并 向服务器端口发送ACK;
2、FIN_WAIT_2进入:此时应用程序端口收到了FIN,然后向服务器端发送ACK;TIME_WAIT是为了实现TCP 全双工连接的可靠性关闭,用来重发可能丢失的ACK报文;需要持续2个MSL(最大报文生存时间):假设应用程序端口在进入TIME_WAIT后,2个 MSL时间内并没有收到FIN,说明应用程序最后发出的ACK已经收到了;否则,会在2个MSL内在此收到ACK报文;
(9)CLOSE_WAIT:(被动关闭)服务器端在收到FIN后,发送ACK,状态为CLOSE_WAIT;如果此时服务器端还有数据需要发送,那么就发送,直到数据发送完毕;此时,服务器端发送FIN,状态变为LAST_ACK;
(10)LAST-ACK: (被动关闭)当被动关闭的一方在发送FIN报文后,等待对方的ACK报文的时候,就处于LAST_ACK 状态。当收到对方的ACK报文后,也就可以进入到CLOSED 可用状态了。