一、tcp连接
tcp连接是一种可靠的传输方式,它为接下来http数据请求及传输提供了保障。 这种可靠的传输方式就涉及到三次握手和四次挥手。 三次握手的目的是连接服务器的指定端口,建立TCP连接,并同步连接双方的确认号和序列号并交换TCP窗口大小信息。
(1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
二、三次握手

1、第一次握手
客户机主动打开TCP连接---->服务器发送一个报文。 报文携带的首部的同步位,也就是发起连接SYN=1和报文序列号是seq=x到达服务器,服务器被动打开TCP连接。
2、第二次握手
并会立即向客户端发送一个确认报文,报文携带着发起连接SYN=1,确认位ACK=1,(代表确认报文是有效的,ACK=0,报文是没有意义的,会被忽略。)小写的ack=x+1,(代表确认位字段的值,收到seq=x,回复x+1加以确认)seq=y,发送自己的报文序列号。
3、第三次 握手
客户端收到后,会再次发送一次报文来告诉服务端我收到了你的报文。报文携带着确认有效的报文,大写ACK=1,以及客户端第二次发送报文序列号就会加一,seq=x+1,和收到服务端的报文序列号,回复y+1加以确认。 此时三次握手完成。
为什么还要进行第三次握手?
第三次握手进行确认,是为了避免第一次握手发送报文由于网络不稳定原因,报文被滞留在网络中,超时后客户端会自动再发送一次报文,此时连接成功,第一次发送的报文可能会在连接成功后会再次发送到服务端,服务端响应客户端,由于此时连接已成功,客户端便不会进行第三次握手加以确认,所以此次请求便会作废。
三、SYN攻击
在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.
Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击
netstat -n -p TCP | grep SYN_RECV
一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等.但是不能完全防范syn攻击。
四、四次握手

TCP的半关闭,TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
客户端和服务器均可主动发起挥手动作。
第一次挥手
客户端发送了一个释放连接的报文FIN=1,指定了报文的序列号seq=u,并且停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1终止等待1状态,等待服务器的确认。
第二次挥手
服务端收到FIN报文之后,他会发送一个确认报文,确认段大写的ACK=1,表示此报文有效,小写的ack=u+1,表示收到了客户端的序列号,并对序列号+1进行回应确认,同时携带上自己的序列号seq。服务端进入close_wait关闭等待状态,此时TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到确认后,此时客户端进入FIN_WAIT2终止等待2状态,等待服务器发送释放连接报文段。
第三次挥手
此时服务端也开始要释放连接,它会再次向客户端发送一个释放连接的报文FIN=1,还有大写ACK=1,确认报文有效,小写的ack=u+1,进行回复确认,还会携带上自己的序列号seq,服务器进入LAST_ACK最后确认状态。
第四次挥手
客户端收到FIN报文后,会进行确认应答。发送一个大写ACK=1确认报文有效,客户端第二次发送报文,此时客户端序列+1,seq=u+1,同时会回复一个小写ack=服务器序列+1进行回复确认。服务端接收到报文后,会进入closed关闭状态。此时客户端会进入TIME_WAIT状态,有2MSL(一个报文段最大生存事件MSL)等待状态,以确保服务端收到自己的报文,若超时后,会进行重发。