TCP的连接建立
面向连接
定义:在发送数据之前,需要建立一条点到点的连接
(参数协商的过程。因为tcp要保证可靠,所以tcp通信是发生在双方之间、两端之间的,两端在正式发送数据之前需要约定一些初始参数,这个过程就是面向连接的过程。)
如何区分tcp连接(4个参数)
源IP地址、目标IP地址、源端口、目标端口 --- TCP四元组可以唯一区分和标识一条TCP的连接。
TCP报文结构
序列号
tcp是基于“字节流”的协议。每发送一个字节,序列号+1,所以序列号就是字节流的编号。
确认序列号
表明接收方希望收到发送方发送的下一个字节的序号。
首部长度
单位为字节。TCP报文头部长度,因为TCP报文存在选项字段,我们称为可变长头部,TCP头部最短位20个字节。
保留
6位,暂时没有启用的字段。
6个标记位:
URG---紧急标记位。如置1,代表此tcp报文数据部分中包含需要紧急处理的数据(用上层应用层定义)并将需要紧急处理的数据放在正常数据最前面同时紧急指针被激活。
ACK---确认标记位。如置1,表示这个tcp报文段它具有确认功能同时确认序列号被激活。
FIN---结束标记位。如置1,表示正常协商断开tcp连接的过程。
RST---重置连接。如置1,表示异常断开,如直接断开或单方面强制断开
SYN---建立TCP连接时需要置1,代表希望与之建立tcp连接,同时会给序列号设置一个随机的初始值。
窗口大小
tcp间实现流控的关键参数,对流量传输的速率进行控制。流控是tcp保证可靠的一个机制。
校验和:伪头部校验
TCP的三次握手
TCP状态变化
客户端
1、关闭状态 --- 在发送SYN请求建立连接之后,进入到下一个状态
2、SYN_SENT --- 客户端等待服务器返回SYN_ACK报文
3、建立完成 --- 收到服务器返回的SYN_ACK报文,因为此时客户端指向服务器的会话已经建立完成,所以客户端发送给服务器的最后一个ACK报文,是允许携带数据的。
服务器
1、关闭状态 ,当服务器的应用程序创建一个监听的套接字之后,将进入下一个状态。
2、Listen(侦听状态),当接收到客户端发送的SYN报文之后,为TCP连接分配缓存空间,同时发送SYN_ACK报文段,进入到下一个状态。
3、SYN_RCVD状态,等待客户端回复ACK,收到之后,进入下一个状态
4、建立完成状态 --- TCP双向会话均建立完成。
SYN泛洪攻击
解决办法
1、防火墙代理
2、SYN Cookie
服务器在收到SYN请求报文后不会立即分配缓存空间,他会将四元组(源ip、目
标ip、端口号、随机数)提取做hash哈希运算,输出得出摘要值即SYN Cookie。服务
器回复客户端时将SYN Cookie充当初始序列号,等待客户端回复ACK,收到后将客
户端回复的ACK四元组中的源ip、目标ip、端口号加上之前的随机数再次进行hash,
得出结果+1,与客户端回复的ACK Num对比,如果相同则为其分配缓存空间。
为什么必须是三次握手,而不是两次或者四次?? 
不是四次 --- 节省资源,防止资源浪费
不是两次 --- 三次握手可以防止旧的重复连接造成混乱