了解三次握手和四次挥手以前,咱们先了解计算机网络体系结构的通讯协议:服务器
物理层(Physics Layer) 数据链路层(Data Link Layer) 网络层(Network Layer) 传输层(Transport Layer) #完成数据传送服务, 会话层(Session Layer) #面向用户 表示层(Presentation Layer) #面向用户 应用层(Application #面向用户
做为互联网的基础协议,没有它就根本不可能上网,任何和互联网有关的操做都离不开TCP/IP协议。不过TCP/IP协议也是这三大协议中配置起来最麻烦的一个,单机上网还好,而经过局域网访问互联网的话,就要详细设置IP地址,网关,子网掩码,DNS服务器等参数。
TCP/IP尽管是目前最流行的网络协议,但TCP/IP协议在局域网中的通讯效率并不高,使用它在浏览“网上邻居”中的计算机时,常常会出现不能正常浏览的现象。此时安装NetBEUI协议就会解决这个问题。网络
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无链接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP提供了无链接通讯,且不对传送数据包进行可靠性保证,适合于一次传输少许数据,UDP传输的可靠性由应用层负责。经常使用的UDP端口号有:
应用协议 | 端口号tcp
-- | -- DNS | 53 TFTP | 69 SNMP| 161
一般状况创建一个TCP链接都会有三个阶段: tcp三次握手、数据传输、tcp四次挥手。spa
报文段首部解析.net
创建TCP须要三次握手才能创建,而断开链接则须要四次握手。整个过程以下图所示:
计算机网络
先来看看如何创建链接的:code
首先Client端发送链接请求报文,Server段接受链接后回复ACK报文,并为此次链接分配资源。 Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP链接就创建了。
断开链接简单过程以下:blog
中断链接端能够是Client端,也能够是Server端事务
假设Client端发起中断链接:
假设Client端发起中断链接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",可是若是你还有数据没有发送完成,则没必要急着关闭Socket,能够继续发送数据。因此你先发送ACK,"告诉Client端,你的请求我收到了,可是我还没准备好,请继续你等个人消息"。这个时候Client端就进入FIN_ WAIT状态,继续等待Server端的FIN报文。当Server端肯定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭链接了"。Client端收到FIN报文后,"就知道能够关闭链接了,可是他仍是不相信网络,怕Server端不知道要关闭,因此发送ACK后进入TIME_WAIT状态,若是Server端没有收到ACK则能够重传。“,Server端收到ACK后,"就知道能够断开链接了"。Client端等待了2MSL后依然没有收到回复,则证实Server端已正常关闭,那好,我Client端也能够关闭链接了。Ok,TCP链接就这样关闭了!资源
整个过程Client端所经历的状态以下:
Server端所经历的过程以下:
注意: 在TIME_ WAIT状态中,若是TCP client端最后一次发送的ACK丢失了,它将从新发送。TIME_WAIT状态中所须要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待以后链接正式关闭,而且全部的资源(包括端口号)都被释放。
TCP协议端口链接状态:
LISTENING: 提供某种服务,侦听远方TCP端口的链接请求,当提供的服务没有被链接时,处于LISTENING状态,端口是开放的,等待被链接。
SYN_ SENT (客户端状态): 客户端调用connect,发送一个SYN请求创建一个链接,在发送链接请求后等待匹配的链接请求,此时状态为SYN_SENT。
SYN_ RECEIVED (服务端状态): 在收到和发送一个链接请求后,等待对方对链接请求的确认,当服务器收到客户端发送的同步信号时,将标志位ACK和SYN置1发送给客户端,
此时服务器端处于SYN_RCVD状态,若是链接成功了就变为ESTABLISHED,正常状况下SYN _RCVD状态很是短暂。
ESTABLISHED: ESTABLISHED状态是表示两台机器正在传输数据。
FIN-WAIT-1: 等待远程TCP链接中断请求,或先前的链接中断请求的确认,主动关闭端应用程序调用close,TCP发出FIN请求主动关闭链接,以后进入FIN_WAIT1状态。
FIN-WAIT-2: 从远程TCP等待链接中断请求,主动关闭端接到ACK后,就进入了FIN-WAIT-2 。这是在关闭链接时,客户端和服务器两次握手以后的状态,是著名的半关闭的状态了,在这个状态下,应用程序还有接受数据的能力,可是已经没法发送数据,
可是也有一种多是,客户端一直处于FIN_WAIT_2状态,而服务器则一直处于WAIT_CLOSE状态,而直到应用层来决定关闭这个状态。附半关闭例图:
CLOSE-WAIT: 等待从本地用户发来的链接中断请求 ,被动关闭端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也做为文件结束符传递给上层应用程序),并进入CLOSE_WAIT。
CLOSING: 等待远程TCP对链接中断的确认,处于此种状态比较少见。
LAST-ACK: 等待原来的发向远程TCP的链接中断请求的确认,被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭链接,TCP也发送一个 FIN,等待对方的ACK.进入LAST-ACK。
TIME-WAIT: 在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态,等待足够的时间以确保远程TCP接收到链接中断请求的确认,很大程度上保证了双方均可以正常结束,可是也存在问题,须等待2MSL时间的过去才能进行下一次链接。
CLOSED: 被动关闭端在接受到ACK包后,就进入了closed的状态,链接结束,没有任何链接状态。
问题:
为何链接的时候是三次握手,关闭的时候倒是四次握手?
答:由于当Server端收到Client端的SYN链接请求报文后,能够直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。可是关闭链接时,当Server端收到FIN报文时,极可能并不会当即关闭SOCKET,因此只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端全部的报文都发送完了,我才能发送FIN报文,所以不能一块儿发送。故须要四步握手。
为何TIME_WAIT状态须要通过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,咱们能够直接进入CLOSE状态了,可是咱们必须假象网络是不可靠的,有能够最后一个ACK丢失。因此TIME_WAIT状态就是用来重发可能丢失的ACK报文。
17ce 和360奇云能够测量运营商的网是否无缺
本文参考: http://blog.csdn.net/whuslei/article/details/6667471/#comments)