1、三次握手?
TCP协议为了准确无误地将数据送达目标处,TCP协议采用了三次握手策略。即用TCP协议将数据包送出去后,TCP不会不传送后的情况置之不理,它一定会确认身份成功送达。
握手过程中使用了TCP的标志(Flag)——SYN(synchronize)和ACK(acknowledgement)
20180602091919245.png上文中的过程在微软的support文档中有更详细的描述(无梯子只能看到这个,后续有空将通过wiki等再补充)
传送门: 微软support文档——三次握手
此处对SYN和ACK的描述有一些不同
SYN:Synchronize sequence numbers 同步序列编号
ACK: Acknowledgement field significant 确认字段标志
结合这篇博客:TCP/IP详解——TCP/IP连接各个状态转换分析
以及这篇博客:TCP的那些事儿
则实际的三次握手过程如下图所示。
20180602101209123.png第一次握手:主机A发送位码为syn=1,ack=0,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
完成三次握手,主机A与主机B开始传送数据
三次握手的作用主要是要初始化Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)——所以叫SYN。也就上图中的 x 和 y。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。
2、四次挥手?
对于4次挥手,其实你仔细看是2次,因为TCP是全双工的,所以,发送方和接收方都需要Fin(关闭连接,)和Ack。只不 过,有一方是被动的,所以看上去就成了所谓的4次挥手。如果两边同时断连接,那就会就进入到CLOSING状态,然后到达TIME_WAIT状态。下图是 双方同时断连接的示意图。
1321.png至于这个server端的close信号从哪里来,我后面会进行补充(我现在不知道)
因此整个完整的流程应该如下图所示。
20180602103345499.png3、为什么握手三次,挥手却要四次?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
tips:
我们来看一下TCP头的格式
20180602105942808.png你需要注意这么几点:
(1)TCP的包是没有IP地址的,那是IP层上的事。但是有源端口和目标端口。
(2)一个TCP连接需要四个元组来表示是同一个连接(src_ip, src_port, dst_ip, dst_port)准确说是五元组,还有一个是协议。但因为这里只是说TCP协议,所以,这里我只说四元组。
注意上图中的四个非常重要的东西:
Sequence Number是包的序号,用来解决网络包乱序(reordering)问题。
Acknowledgement Number就是ACK——用于确认收到,用来解决不丢包的问题。
Window又叫Advertised-Window,也就是著名的滑动窗口(Sliding Window),用于解决流控的。
TCP Flag ,也就是包的类型,主要是用于操控TCP的状态机的。
4、三次握手有哪些安全隐患?
SYN- Flood攻击是当前网络上最为常见的DDoS攻击,也是最为经典的拒绝服务攻击,它就是利用了TCP协议实现上的一个缺陷,通过向网络服务所在端口发送大量 的伪造源地址的攻击报文,就可能造成目标服务器中的半开连接队列被占满,从而阻止其他合法用户进行访问。这种攻击早在1996年就被发现,但至今仍然显示 出强大的生命力。很多操作系统,甚至防火墙、路由器都无法有效地防御这种攻击,而且由于它可以方便地伪造源地址,追查起来非常困难。它的数据包特征通常 是,源发送了大量的SYN包,并且缺少三次握手的最后一步握手ACK回复。
原理:攻击者首先伪造地址对 服务器发起SYN请求,服务器回应(SYN+ACK)包,而真实的IP会认为,我没有发送请求,不作回应。服务 器没有收到回应,这样的话,服务器不知 道(SYN+ACK)是否发送成功,默认情况下会重试5次(tcp_syn_retries)。这样的话,对于服务器的内存,带宽都有很大的消耗。攻击者 如果处于公网,可以伪造IP的话,对于服务器就很难根据IP来判断攻击者,给防护带来很大的困难。
5、TCP和UDP(用户数据报协议)有什么区别?
TCP与UDP基本区别
1.基于连接与无连接
2.TCP要求系统资源较多,UDP较少;
3.UDP程序结构较简单
4.流模式(TCP)与数据报模式(UDP);
5.TCP保证数据正确性,UDP可能丢包
6.TCP保证数据顺序,UDP不保证
从以上的特点来看,UDP用来做广播效果就非常好
UDP应用场景:
1.面向数据报方式
2.网络数据大多为短消息
3.拥有大量Client
4.对数据安全性无特殊要求
5.网络负担非常重,但对响应速度要求高
搬运自我自己的CSDN博客:https://blog.csdn.net/bibiophile/article/details/80545104
网友评论