TCP 和 UDP协议

目录

 建立连接(三次握手)

解除连接 (四次挥手)

挥手需要四次

拓展(有限状态机)

Tcp面向连接的协议:tcp是面向连接的,可靠的进程到进程通信的协议,tcp提供全双工服务,即数据可在同一时间双向传输,每一个tcp都有发送缓存和接收缓存,用来临时存储数据。

Udp协议是无连接,不保证可靠性的传输层协议,发送端不关心发送的数据是否发送到达目标主机、数据是否出错等,收到数据的主机也不会告诉发送方是否收到了数据,他的可靠性由上层协议来保障,传输数据速度更快,效率更高。

 建立连接(三次握手)

TCP 和 UDP协议_第1张图片

Pc1 会发送 SYN报文 请求连接  seq=x(数据段的序号)SYN=1(同步位为1 代表请求建立连接)

Pc2 收到请求包 会回复 SYN+ACK的报文 seq=y(pc2发送的数据段序号)ack=x+1(确认号,希望pc1回复的报文序号为x+1)  SYN=1(同步位等于1 代表收到了pc1的请求)ACK=1(确认位为1  代表同意建立连接)

Pc1收到pc2的回复后 会发送一个序号为x+1的数据段,确认号为ack=y+1(正式传输数据时 第一包的序号为y+1)  确认位为1代表  同意连接

小写的ack是确认号    大写的ACK是确认位

syn  请求连接      syn=1    同步位

fin   断开结束      fin=1    断开位

ack  确认关系       ack=1    确认位

rst   数据传输有问题 在重新传输一次 重置位

解除连接 (四次挥手)

TCP 和 UDP协议_第2张图片

建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务器均可主动发起挥手动作。

刚开始双方都处于 ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下:

第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。

即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。

第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。

即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。

第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。

即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。

第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。

即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。

收到一个FIN只意味着在这一方向上没有数据流动。客户端执行主动关闭并进入TIME_WAIT是正常的,服务端通常执行被动关闭,不会进入TIME_WAIT状态。

挥手需要四次

是因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。

拓展(有限状态机)

1、CLOSED 没有任何连接状态

2、LISTEN 侦听状态,等待来自远方TCP端口的连接请求 (服务开启 http(进程) 80端口在帮进程 看着 有没有人找 http )

3、SYN-SENT 在发送连接请求后,等待对方确认

4、SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认

5、ESTABLISHED 代表传输连接建立,双方进入数据传送状态

6、FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认

7、FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求

8、TIME-WAIT 完成双向传输连接关闭,等待所有分组消失

9、CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认

10、LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失

11、CLOSING 双方同时尝试关闭传输连接,等待对方确认

你可能感兴趣的:(tcp/ip,udp,网络)