TCP传输协议

 

TCP是主机对主机层的传输控制协议,提供可靠的链接服务,采用三次握手确认创建一个链接,四次挥手断开链接。编程

三次握手

是指创建一个TCP链接时,须要客户端和服务端总共发送3个包以确认链接创建成功。在socket编程中,这一过程由客户端执行connect来触发。完成三次握手,随后Client与Server之间能够开始传输数据了网络

SYN攻击:socket

在三次握手过程当中,Server发送SYN-ACK以后,收到Client的ACK以前的TCP链接称为半链接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短期内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,因为源地址是不存在的,所以,Server须要不断重发直至超时,这些伪造的SYN包将长时间占用未链接队列,致使正常的SYN请求由于队列满而被丢弃,从而引发网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式很是简单,即当Server上有大量半链接状态且源IP地址是随机的,则能够判定遭到SYN攻击了,使用以下命令可让之现行:blog

 #netstat -nap | grep SYN_RECV队列

Q : 为何要三次握手, 两次不能够吗?资源

A : 试想一下, A第一次发送请求链接, 可是在网络某节点滞留了, A超时重传, 而后这一次一切正常, A跟B就愉快地进行数据传输了. 等到链接释放了之后, 那个迷失了的链接请求忽然到了B那, 若是是两次握手的话, B发送确认, 它们就算是创建起了链接了. 事实上A并不会理会这个确认, 由于我压根没有要传数据啊. 可是B却傻傻地觉得有数据要来, 苦苦等待. 结果就是形成资源的浪费.请求

更加接地气的解释就是 : A打电话给Bgrep

第一次握手 : 你好, 我是A, 你能听到我说话吗第二次握手 : 听到了, 我是B, 你能听到我说话吗第三次握手 : 听到了, 咱们能够开始聊天了三次握手其实就是为了检测双方的发送和接收能力是否正常, 你说呢?im

四次挥手

指断开一个TCP链接时,须要客户端和服务端总共发送4个包以确认链接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发, 因为TCP链接时全双工的,所以,每一个方向都必需要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN(finish)来终止这一方向的链接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,可是在这个TCP链接上仍然可以发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另外一方则执行被动关闭。实际中还会有出现同时发起主动关闭的状况通信

Q : 为何要四次挥手, 而不是两次, 三次?

A :

首先, 因为TCP的全双工通讯, 双方都能做为数据发送方. A想要关闭链接, 必需要等数据都发送完毕, 才发送FIN给B. (此时A处于半关闭状态)

而后, B发送确认ACK, 而且B此时若是要发送数据, 就发送(例如作一些释放前的处理)

再者, B发送完数据以后, 发送FIN给A. (此时B处于半关闭状态)

而后, A发送ACK, 进入TIME-WAIT状态

最后, 通过2MSL时间后没有收到B传来的报文, 则肯定B收到了ACK了. (此时A, B才算是处于彻底关闭状态)

PS : 仔细分析以上步骤就知道为何不能少于四次挥手了.

Q : 为何要等待2MSL(Maximum Segment Lifetime)时间, 才从TIME_WAIT到CLOSED?

A : 在Client发送出最后的ACK回复,但该ACK可能丢失。Server若是没有收到ACK,将不断重复发送FIN片断。因此Client不能当即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK以后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。若是在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。MSL指一个片断在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。若是直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP链接。

更加接地气的解释 :

第一次挥手 : A告诉B, 我没数据发了, 准备关闭链接了, 你要发送数据吗第二次挥手 : B发送最后的数据第三次挥手 : B告诉A, 我也要关闭链接了第四次挥手 : A告诉B你能够关闭了, 我这边也关闭了

相关文章
相关标签/搜索