1.报文格式
2.tcp三次握手、数据传输、四次挥手过程(图片来源于网络,侵删)
3.tcp状态机
4.滑动窗口机制(window)
在没有滑动窗口机制情况下,每发送一个报文就需要等待对方回复ACK后才会发送下一个tcp报文;但在有滑动窗口的机制下,在未收ACK确认报文前,只有发送报文的数据大小不超过滑动窗口大小时,就可以继续发送;当发送的数据包达到滑动窗口大小时,就需要等待ACK确认报文。接收端如果开启滑动窗口机制,只需要对连续的seq值得最大值报文回复ack即可;也用于解决网络拥塞问题。
4.tcp定时器
A. connection-establishment timer 建立连接等待时间(linux默认5s)
在syn-sent或syn-received ,未收到syn-ack或ack报文的超时时间;重新连接次数为:net.ipv4.tcp_syn_retries或net.ipv4.tcp_synack_retries
B. retransmission time 重传计时器(linux默认20s)
在发送数据后,在重传计时器结束前未收到接收端发送的ack确认报文。tcp重传次数为:net.ipv4.tcp_retries2
C. delayed ACK timer 延迟应答定时器
在数据传输过程中,在收到server发送的数据后,不立即发送ack应答,而是在计时器结束前没有收到server再次发送后续数据时才发送ack确认报文;需要注意:延迟应答计时器(捎带计时器)< 重传计时器 - 数据传输和处理延迟时间
D. keepalive timer 保活计时器
目的:避免在客户端与服务器建立连接后,出现长时间的空闲期,没有数据传输,此时可能客户端出现故障,但服务器该连接一直处于保活,浪费服务器资源。
原理:在保活时间结束后,服务器每个一个周期keepalive_intvl向客户端发送tcp探测报文,总共发送tcp_keepalive_probes次。
E. FIN_WAIT_2 timer
主动关闭端发送FIN报文,且收到ACK报文后,在FIN_WAIT_2 timer计时器结束前未收到对方发送的后续报文,则关闭TCP连接。避免对方或网络出现故障,导致主动关闭方一直处于FIN_WAIT_2状态。
F. TIME_WAIT timer(2MSL timer)
主动关闭方在发送最后一个ACK后不会立即进入CLOSE状态,而时进入TIME_WAIT状态。因为对方可能没有收到ACK,需要在2MLS周期内,等待被动关闭方重新发送FIN报文,主动关闭方回复最后一个ACK;且在2MSL周期内之前的端口(源端口)不能被使用,避免新建的连接与之前建立连接迟到的报文冲突,且在任何迟到的报文会被丢弃。