IP:网络层 不稳定性。硬件联系紧密
传输层: 1. 完全不弥补--UDP--无连接不可靠报文传输
2. 完全弥补--TCP--面向连接的可靠数据包传递
TCP发送数据就包含了TCP三次握手建立连接和关闭连接的四次握手
三次握手
(建立连接用SYN发送,用ACK应答)
所谓三次握手就是客户端与服务器之间的三次应答。服务器是一直在监听等待,只有客户端主动找服务器的时候服务器才会回应这个客户端,而不是服务器去找客户端,所以第一次握手就是客户端给服务器发送数据(SYN)。服务器接到数据后,会给客户端回两种数据(SYN+ACK),这是第二次握手,其中ACK数据会比客户端发给服务器的数据多1,表示让客户端知道服务器接到了自己的数据,然后发送代表自己的SYN数据。最后第三次握手,就是客户端给服务器回ACK数据,同样多1,表示客户端收到了服务器的数据。
通俗来讲:一天张三给李四打电话,电话接通后张三说:“李四,能听见我说话吗?”(这就是客户端给服务器发送数据)。李四:“张三,我能听到你说话,你能听到我说话吗?”(这是服务器给客户端回数据,服务器必须先应答客户端的数据后才能发送自己的数据,表示能收到客户端的数据,同时也要确认客户端能收到自己的数据)张三:“可以听到,李四。”(客户端给服务器回数据,表示自己能收到服务器的数据,这样连接就建立起来了)
三次握手是建立连接的最优方案,两次会有不确定性,四次又会浪费资源。
这是官方解释:
- 第一次握手:建立连接时,客户端发送SYN包(SYN=j)到服务器,此时客户端进入SYN_SENT状态,并挂起等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
- 第二次握手:当服务器收到客户端发来的SYN包后,必须确认客户的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态。
至此完成三次握手。
四次握手(四次挥手)
TCP中客户端和服务器断开连接时得要进行四次握手来断开连接,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。断开流程如下图所示:
上图中间的四个箭头即为四次挥手。
官方说明
- 当准备断开TCP连接时,客户端作为主动关闭方向服务端发送一个FIN,用来关闭客户端到服务端的数据传送,此时客户端进入FIN_WAIT1状态。
- 服务端接收到这个FIN后,向客户端发回一个ACK确认包,此时服务端进入CLOSE_WAIT状态。
- 客户端接收到服务端发回的ACK确认包后,进入FIN_WAIT1状态。
- 服务端关闭与客户端的连接,并发送一个FIN给客户端,此时服务端进入LAST_ACK状态。
- 客户端收到服务端发来的FIN包后,发回ACK报文确认,然后进入TIME_WAIT连接度断开状态,等2MSL后客户端即可回到CLOSED可用状态了。
- 服务端接收到ACK后,便进入连接断开状态
张三给李四打电话。确认打通后,张三巴拉巴拉说了一大堆,然后张三说“我的事说完了,你还有什么要说的没?”,这就相当于客户端主动和服务器断开连接,这就是第一次握手。李四:“你的事说完了?好吧。”这是服务器对客户端断开连接的请求的回应,这时客户端就单方面的断开了,现在就处于半关闭状态,理论上客户端现在只能接受数据,不能发送数据,就像张三现在就只能听李四说他的事,不能再说自己的事了。好,现在服务器可以给客户端发送数据或者选择断开连接,李四:“我也没啥事了,拜拜。” 第三次握手,服务器请求断开连接。张三:“好,拜拜。”第四次握手,客户端回应服务器断开连接的请求,到这里才算真正断开了连接。
TCP十种状态
LISTEN:表示服务端的处于连接监听状态,可以接受来自客户端的连接。
SYN_SENT:这个状态与SYN_RCVD相对应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
SYN_RCVD:这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。
ESTABLISHED:客户端/服务端连接建立。
FIN_WAIT_1:该状态是当客户端SOCKET在ESTABLISHED状态时,它想主动关闭连接,向服务端发送了FIN报文,此时该客户端SOCKET即进入到FIN_WAIT_1状态。
CLOSE_WAIT:该状态的含义是表示服务端在等待关闭连接。当客户端关闭SOCKET后发送FIN报文给服务端,服务端毫无疑问地会回应一个ACK报文给客户端,此时服务端则进入到CLOSE_WAIT状态。
FIN_WAIT_2:当客户端处于FIN_WAIT_1状态时,当收到服务端回应ACK报文后,则客户端会立即进入到FIN_WAIT_2状态。
LAST_ACK:该状态是服务端在发送FIN报文后,最后等待客户端的ACK报文。当收到客户端的ACK报文后,也即可以进入到CLOSED可用状态了。
TIME_WAIT:该状态表示客户端收到了服务端的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。
CLOSED:这个状态没什么好说的了,表示连接关闭后回到初始状态。