TCP相关

137 阅读4分钟

TCP和UDP区别

TCP是需要建立连接的,UDP不需要

TCP是可靠的,UDP不可靠

TCP可靠体现在:

有状态

TCP会精准的记录哪些数据发送了,哪些被对方接收了,哪些没被接收,并且可以保证按照数据包按顺到达,不会出差错。

可控制

如果出现了丢包或网络不好的情况,TCP会自动调节发送速度或是重发。保证精准送达。

UDP的不可靠是因为它不需要维护状态,也不需要关心是否发送成功,只是发出去就好。

TCP基于字节流,UDP基于数据包

TCP为了维护状态,把数据包变成了字节流。UDP不需要维护状态,直接把请求数据原封不动发出去就可以。

TCP的三次握手

目的

TCP之所以三次握手,目的是为了双方确认彼此的发送接收的能力。

简单的说

三次握手的过程,简单来说就是:

  1. 客户端发送网络包给服务端,服务端收到了。这时服务端就得出结论:客户端的发送能力和服务端的接收能力是正常的。

2.服务端发送网络包,客户端收到了。这时客户端得出结论:服务端的发送能力正常,客户端的接收能力正常。

但是到目前为止,服务端并不知道网络包是否发送成功,客户端有没有正常接收到网络包,这时就要第三次握手:

3.客户端发网络包给服务端,服务端收到了。这时服务器得出结论:大家的接收和发送能力都是正常的。

详细流程

起初,客户端和服务端都是close状态的。然后服务器开始监听某个端口,进入LINTEN状态。

第一次握手:接着客户端发起请求,发送SYN(SYN=1)和随机产生的seq number = 123456数据包给服务器,自己状态变为SYN-SENT.

第二次握手:服务端接收请求,向客户端发送SYN(SYN=1)、ACK(ACK=1)和ack number(ack = 客户端seq+1),还有随机产生的seq number=7654321的包,自己的状态变为SYN-REVD.

第三次握手:客户端收到请求后,会检查传来的ack number是否正确(ack number=客户端第一次传的seq+1),已经ACK是否是1。若正确,自己状态变为ESTABLISHED状态,客户端会再发送ACK(ACK=1),ack number(ack number=服务器传来的seq+1)给服务端,服务器校验ACKseq number正确后,若正确,状态也变为ESTABLISHED.

第三次握手,也就是客户端向服务器发送最后一起网络包时,是可以携带请求数据的,因为这时客户端已经是ESTABLISHED状态。

如果第一次握手就发送数据,有可能会造成恶意的大量数据传给服务器,这样服务器就需要更长的时间和更多的内存去处理这些数据,增加服务器被攻击的风险。

第三次握手,服务器需要回复SYN+ACK包,客户端会对比应答的序号,如果发现是旧的报文,就会给服务器发RST报文,直到正常的 SYN 到达服务器后才正常建立连接。

TCP的四次挥手

起初,客户端和服务器都是ESTABLISHED状态。

第一次握手:客户端向服务器端发送一个FIN(FIN = 1)网络包,这时客户端的状态变为FIN_WAIT_1

第二次握手:服务器收到网络包后,发出确认包ACK(ack = u + 1),并带上自己的序列号seq=v,服务器进入WAIT_CLOSE状态。这时,客户端已经不再发送请求了,只是还在接收服务器传来的数据。客户端在收到服务器的ACK时,状态变为FIN_WAIT_2

第三次握手:服务器发送完数据后,会向客户端发送FIN包(seq=w ack=u+1)。半连接状态下服务器可能又发送了一些数据,假设发送seqw。服务器此时进入了LAST_ACK状态。

第四次握手:客户端收到服务器的FIN包后,发出确认包(ACK=1,ack=w+1),此时客户端就进入了TIME_WAIT状态。此时的TCP的连接还没有释放,必须经过2*MSL后,才进入CLOSED状态。而服务器端收到客户端的确认包ACK后就进入了CLOSED状态,可以看出服务器端结束TCP连接的时间要比客户端早一些。

参考自: 淘宝二面,面试官居然把 TCP 三次握手问的这么详细