TCP 三次握手

过程:
- 客户端 SYN=1, seq=x 服务端
- 服务端 SYN=1, ACK=1, ack=x+1, seq=y 客户端
- 客户端 ACK=1, ack=y+1, seq=x+1 服务端
解释:
- SYN代表连接建立请求
- seq是数据段开始序号
- ACK代表确认号启用,ACK=1时,ack才有效
- ack是对对方发送数据的确认,期望收到的对方下一个数据段的起始编号
为什么要有三次分手:
- 简单来讲就是你对我的服务,需要得到我的确认。类似于你在餐厅点菜,你点完菜后,服务员给你念一遍询问你是不是点这些菜,你再确认一下。这样的三次握手的过程,可以避免你最开始的错误点菜。
- 三次握手是为了防止已失效的客户端连接请求报文段突然又传送到了服务端。
TCP 四次挥手

过程:
- 客户端 FIN=1, seq=u 服务端
- 服务端 ACK=1, ack=u+1, seq=v 客户端,注意这一步没有FIN
- 服务端 FIN=1, ACK=1, ack=u+1, seq=w 客户端
- 客户端 ACK=1, ack=w+1, seq=u+1 服务端
解释:
- FIN代表连接结束请求
- Close Wait此时处于半关闭状态,客户端无数据发送,服务端可能还有数据发送
- MSL(Maximum Segment Lifetime)指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间,可以简单理解为一个RTT。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
为什么要有四次分手:
- 简单来说,类似于高考时提前交卷,需要得到监控老师的同意,监控老师同意后可能还会给你交代一些事情并让你签字,你同意之后才能离开考场
- 四次分手主要是存在一个半关闭状态,当客户端无数据发送时,服务端可能还有数据要发送,于是服务端先同意客户端的关闭请求,服务端发完自己的数据后,再关闭自己
为什么需要等到2MSL:
- 避免客户端最后一次ACK服务端没有收到。若服务端没有收到,客户会进行超时重传。超时重传是一种可靠传输机制。
- 也是为了防止已失效的客户端连接关闭请求报文段突然又传送到了服务端。
TCP TIME-WAIT 等待 2MSL
为什么需要等到2MSL:
- 避免客户端最后一次ACK服务端没有收到。若服务端没有收到,客户会进行超时重传。超时重传是一种可靠传输机制。
- 也是为了防止已失效的客户端连接关闭请求报文段突然又传送到了服务端。
TCP SYN FLOOD
TCP 可靠传输

可靠传输是一种综合机制,包括,编号,确认和超时重传。流量控制,拥塞控制,校验和
- 编号是对每一个byte进行编号,也就是TCP是面向字节的协议
- 确认是通信一方对收到的另一方的数据的确认,可以进行累积确认
- 超时重传是超过时间限制后,发送方没有收到接收方的确认时,自动重发接收方没有收到的数据
- 流量控制在传输层是跨网络的,接收方控制发送方发送TCP报文速度的一种方式,流量控制是通过滑动窗口来实现的,在传输层,滑动窗口的数值是能够变化的,在数据链路层的流量控制滑动窗口的大小是固定的。
- 拥塞控制是用来控制网络拥塞的,网络拥塞是增多网络中的报文量网络吞吐量反而下降的现象,报文超时重传是网络拥塞的征兆,传输层的拥塞控制涉及“慢开始”,“拥塞避免”和“快恢复”这三个算法
- 发送窗口的大小由接收窗口和拥塞窗口共同决定
TCP 拥塞控制

介绍:横轴是RTT(往返时延,从开始发送数据到接收确认的时间),纵轴是CWnd(拥塞窗口)

介绍:横轴是RTT(往返时延,从开始发送数据到接收确认的时间),纵轴是CWnd(拥塞窗口)

拥塞控制是用来控制网络拥塞的,网络拥塞是增多网络中的报文量网络吞吐量反而下降的现象,报文超时重传是网络拥塞的征兆,传输层的拥塞控制涉及“慢开始”,“拥塞避免”和“快恢复”这三个算法
- 慢开始算法,收到一个确认后,拥塞窗口值变为原来的两倍,以2的n次方形式进行指数增长
- 达到门限值后,执行拥塞避免,收到一个确认后,拥塞窗口值增加1
- 发生超时重传,此时网络可能发生了拥塞,降低门限值为此时拥塞窗口的一半,再又开始执行慢开始算法
- 快恢复算法,当执行拥塞避免后的某一刻收到连续的3个重复ack加上初始ack共4个ack,可能是接收方收到的TCP报文丢失,重复,失序,而重复和失序不一定是网络拥塞造成的,丢失可能是由于网络拥塞造成的,因此执行快恢复算法,拥塞窗口和门限值都为此时拥塞窗口的一半
TCP 最大连接数限制
TCP 粘包/拆包的产生和解决