什么是tcp/ip协议?TCP的三次握手指的是什么

小课堂

分享人:闵仕宇

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

TCP/IP协议是什么


  

通信协议是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信。

TCP/IP协议族按照层次由上到下,层层包装。

2.知识剖析

IP 是无连接的通信协议,用于计算机之间的通信。

通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。

IP 负责将每个包路由至它的目的地。

每个计算机必须有一个 IP 地址才能够连入因特网。

每个 IP 包必须有一个地址才能够发送到另一台计算机。

TCP 用于应用程序之间的通信,使用固定的连接

当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。

在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。

这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。

UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。

TCP/IP 意味着 TCP 和 IP 在一起协同工作。

TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。

IP 负责计算机之间的通信。

TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。

IP 负责将包发送至接受者。

3.常见问题

如何建立TCP/IP连接

IP包如何路由至目标地址

到达目标地址的IP包如何检验完整性

如何拆除连接

4.解决方案

建立TCP/IP的过程就是要讲的三次握手。

即三次握手就是为了解决连接的问题

建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。

(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。

(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

IP包有固定的报文格式,报头有所需要参数

如:源端口、目标端口、确认序号和标志域等。

拆除连接的时候,双方都需要关闭通道

即四次挥手

5.编码实战

6.扩展思考

当短时间大量不存在的IP不断发送SYN包会出现什么情况

在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。

Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。

SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了

为什么一定要三次握手

当A想要建立连接时发送一个SYN,然后等待ACK,结果这个SYN因为网络问题没有及时到达B, 所以A在一段时间内没收到ACK后,再发送一个SYN,这次B顺利收到,接着A也收到ACK,这时A发送的第一个SYN终于到了B, 对于B来说这是一个新连接请求,然后B又为这个连接申请资源,返回ACK,然而这个SYN是个无效的请求,A收到这个SYN的ACK后也并不会理会它, 而B却不知道,B会一直为这个连接维持着资源,造成资源的浪费。

两次握手的问题在于服务器端不知道一个SYN是否是无效的,而三次握手机制因为客户端会给服务器回复第二次握手, 也意味着服务器会等待客户端的第三次握手,如果第三次握手迟迟不来,服务器便会认为这个SYN是无效的,释放相关资源。 但这时有个问题就是客户端完成第二次握手便认为连接已建立,而第三次握手可能在传输中丢失,服务端会认为连接是无效的, 这时如果Client端向Server写数据,Server端将以RST包响应,这时便感知到Server的错误。

总之,三次握手可以保证任何一次握手的失败都是可感知的,不会浪费资源

7.参考文献

https://www.jianshu.com/p/ef892323e68f

http://blog.csdn.net/u013344815/article/details/72134950

8.更多讨论

Thanks

By : 上海分院 闵仕宇