TCP在不可靠的IP层之上实现的可靠的数据传输协议。TCP提供面向连接的、可靠的数据传输服务。TCP连接是点对点的,TCP提供全双工通信(双方的应用进程在任何时候都能发送数据)。TCP是面向字节流的。
TCP适用于远程登录、邮件发送接收、文件传输等应用场景。
一、TCP报文
TCP报文段既可用来运载数据,也可以用来建立链接、释放链接和应答。
TCP报文分为TCP首部和TCP数据两部分。首部最短为20个字节(前20字节固定),通常为4的整数倍,最长为60字节。
首部内容包括:
- 源端口和目的端口:各占2字节。
- 序号:本报文段发送的数据第一个字节的序号。
- 确认号:期望收到下一个报文段的数据的第一个字节的序号。
- 数据偏移:4位。首部长度
- 保留字段
- 几个标志位:紧急位、确认位、推送位、同步位、终止位、复位位
- 窗口:2字节,表示接收方让发送方设置其发送窗口的值。
- 校验和:校验的范围包括首部和数据
- 紧急指针
- 选项字段
- 填充
二、三次握手
1、过程
- 发送方向接收方发送一个SYN标志位被置1的连接请求报文,该报文不包含应用层数据。
- 接收方发送一个连接确认报文,它的SYN和ACK标志位都置1,不包含应用层数据。
- 发送方发送连接确认报文的确认报文,ACK置1,可以携带应用层数据。
服务器资源是在第二次握手时分配的,客户端资源是在第三次握手时分配的。
2、为什么要进行三次握手,第三次取消不可以吗?
三次握手是为了发送方和接收方确认自己和对方的发送和接收都是正常的。如果第三次握手取消,那么可能会出现问题。例如,当服务器发送了连接确认报文后,它认为,此次连接已经建立,等待接收客户端发送的数据。而连接确认报文丢失,客户端会重传连接请求报文,而服务器则会丢掉该报文,无法正常进行通信。
3、SYN洪泛攻击
利用TCP三次握手机制,攻击者伪造不存在的IP向服务器发送连接请求报文,而服务器发送的连接确认报文永远得不到回复,在等待关闭连接的过程中服务器消耗资源。
防范措施:
- 减少timeout的时间,使主机更快释放半连接的占用。
- 如果短时间内连续收到某个IP的重复SYN请求,则认为受到了该IP的攻击,丢弃来自该IP的后续请求报文。
三、四次挥手
1、过程
- 客户端发送一个FIN数据包,用来关闭客户端到服务器端的数据传输。
- 服务器端收到这个FIN,发回一个ACK确认。至此,TCP连接处于半关闭状态。
- 服务器发送一个FIN数据包,用来关闭服务器到客户端的数据传输。
- 客户端发回一个ACK确认。
2、为什么要进行四次挥手
TCP提供全双工通信,两个方向的连接都要关闭。
3、TIME_WAIT状态
是指主要关闭连接的一方在发送完最后一个ACK包后,会保持2MSL时间的TIME_WAIT状态。MSL是指一个IP数据包能够在网络中生存的最大时间。
这是为了保证可靠地关闭TCP连接。假设最后一个ACK丢失,server 将重发 FIN , client 必须维护 TCP 状态信息以便可以重发最终的 ACK。
四、TCP流量控制
TCP提供一种基于滑动窗口的流量控制机制,用来匹配发送方的发送速率和接收方的接收速率。
接收方通过设置TCP报文首部的窗口字段告知发送方接收窗口。接收窗口是接收方允许连续接收的最大能力。
五、TCP拥塞控制
TCP拥塞控制的目的是防止过多的数据注入到网络中。它与流量控制的区别:流量控制是要抑制发送端发送数据的速率,以便接收端来得及接收。拥塞控制则是一个全局性的问题。
为了进行拥塞控制,发送方要维护拥塞窗口(反映当前的网络容量)。发送窗口 = min(接收窗口,拥塞窗口)。
采用4种算法:
1.慢开始算法
每经过一个传播轮次,发送方的拥塞窗口就加倍。当拥塞窗口增加至慢开始门限(阈值),改用拥塞避免算法。
2.拥塞避免算法
拥塞窗口线型增长。当出现超时(网络拥塞)时,将慢开始门限设置为当前拥塞窗口的一半,且将拥塞窗口设置为1.
3.快重传和快恢复
快重传:当发送方收到连续3个重复的确认报文时,直接重传对方尚未收到的报文段,不必等待超时。
快恢复:当发送方收到连续3个重复的确认报文时,将慢开始门限设置为当前拥塞窗口的一半,且拥塞窗口设置为慢开始门限值。
快重传和快恢复是对慢开始和拥塞避免算法的改进。