1. 先来说说TCP协议:
我们来看看百度百科怎么说?
"TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。"
简而言之就是TCP协议是在IP协议之上的,但是IP协议不可靠,所以TCP协议就得实现一些可靠性相关的功能。
2. TCP协议特点:
①面向连接的、可靠的、基于字节流的传输层通信协议;
②将应用层的数据流分割成报文段发送给目标节点的TCP层;
③为保证数据正确性和安全性,使用计算校验来检验数据在传输过程中是否有错误,还可以使用MD5对数据进行加密;
④为保证可靠性,每个数据包都有序号,对方收到则发送ACK确认,超过往返时延未收到则重传;
⑤流量控制上,使用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传;
3.三次握手协议:
要了解三次握手协议,TCP报文头中的标志位必须了解一下:
共有6种标志位,URG(紧急指针标志)、ACK(确认序号标志)、PSH(push标志)、RST(重置连接标志)、SYN(同步序号,用于建立连接过程)、FIN(finish标志,用于释放连接),重要的我们需要了解其中3种:ACK、SYN、FIN 。
如果有同学对报文头中还有其他什么信息感兴趣,可以自行去了解学习。
下面说说三次握手的流程:
![](https://img2018.cnblogs.com/blog/1647234/201904/1647234-20190422183000510-535907174.png)
第一次握手:Client将标志位SYN置为1,随机产生一个序列值seq=x,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认;
第二次握手:Server接收到该数据包,由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,再随机产生一个序列值seq = y,并将该数据包发送给Client以确认连接请求,Server进入SYN_REVD状态;
第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则发送ACK=1 seq=x+1 (因为在第一次握手已经消耗了一个序列号) ack=y+1 至Server端,Client进入ESTABLISHED状态,Server收到ACK=1 和ack=y+1,Server进入ESTABLISHED状态,则连接建立成功,完成三次握手,随后Client和Server之间就可以传输数据了。
4.三次握手协议需要注意的地方:SYN攻击/DOS攻击
在客户发送SYN到服务端,服务端返回ACK包后,如果此时并未得到客户端的ACK确认,会重试直到超时,此时连接处于半连接状态,存放在服务器的半连接队列中(超过最大超时时间后会删除该半连接状态的连接),不法分子正是利用这点,短时间内伪造大量ip进行请求,一直不进行第三次握手,导致服务器半连接队列资源耗尽,导致其他正常用户无法正常访问;
怎么防范呢?syn cookie技术是服务器在收到syn包时并不马上分配储存连接的数据区,而是根据这个syn包计算出一个cookie,把这个cookie放入syn+ack包发送,等对方回应ack包时检查cookie的合法性,如果合法再分配专门的数据区。
如何开启syn cookie:sysctl -a | grep syn 查看
net.ipv4.tcp_syncookies=1 为打开
如果为0 ,需要打开怎么办呢?
sysctl -w net.ipv4.tcp_syncookies=1
但是这种方法貌似不是完美的,如果需要完美抵御SYN攻击,需要再学习研究!
参考资料:
1.百度百科;
2.前辈们的博客;
感谢您的阅读,本博客旨在记录学习点滴,欢迎互相学习交流!!