tcp:基于连接,类似打电话,可靠
三次握手:三次握手是建立连接的过程,当客户端向服务端发起连接时,会发送一个syn包,服务端如果允许客户端连接,则回复syn+ack,最后客户端会再向服务端发送ack确认包。
为什么两次握手不行:为了防止已失效的报文,突然又传到服务器端引起错误,比如当客户端发送syn包时,由于网络不稳定,syn在中间滞留,客户端会再发送一次syn包,这次正常到达了
服务端,服务端发送syn+ack包给客户端,建立了连接,当网络恢复后,第一次滞留在网络上的syn包也发送到了服务端,服务端也回复了syn+ack包到客户端,此时就建立了两个连接,实际上是一个连接。所以需要客户端
回复一个ack,也就是第三次握手,才能保证一个连接,解决了在不可靠的信道上建立了可靠的连接。

如何解决丢包问题:
tcp协议为每一个连接建立一个发送缓冲区,从建立连接后的第一个字节的序列号为0,后面每个字节的序列号都会+1,当要发送数据时,发送数据时,从发送缓冲区取一部分数据,组成发送报文,在报文的tcp协议头中
会附带序列号和长度,即:序列号+长度+数据内容,接收端在收到数据之后,会回复确认报文,确认报文ack=序列号+长度=下一个包起始序列号,这样一问一答的发送方式,能够使发送端确认发送的数据已经被对方收到,
这样发送端可以把待发送的数据,分割成一系列的碎片,发送给接收端,接收端根据序列号和长度,在接收后,重构出来完整的数据;发送端也可以发送连续的多包数据,接收端只需要回复一次ack就可以了。

如何解决数据乱序问题:
假设其中丢失了某些数据包,接收端可以要求发送端重传,比如丢失数据包中的序列号为100-199这100个字节的数据包,接收端向发送端发送ack=100的报文,发送收到后重传这一包数据,接收端接收后补齐数据。
以上过程不区分服务端和客户端,因为tcp是全双工的,对于两端来说均采用上述机制。
四次挥手:
客户端和服务端都可以发起关闭连接请求,假设客户端主动发起关闭连接请求,他需要向服务端发送一个fin包,表示要关闭连接,自己进入终止等待1状态,这是第一挥手,服务端向客户端发送ack包,表示自己进入关闭等待状态,客户端收到ack之后,进入第二次终止等待2状态,这是第二次挥手,此时服务端还可以向客户端发送数据,客户端还可以接收数据
此时服务端会向客户端发送一个fin包,服务端进入最后确认状态,这是第三次挥手,客户端收到之后,回复ack包,此时客户端进入超时等待状态,经过超时等待时间后关闭连接,而服务端收到ack包后立即关闭连接,这是第四次挥手,客户端第四次进入超时等待,这是为了保证服务端已经收到ack包,如果客户端发送了ack包之后,就释放连接,ack包有可能因为网络原因,在链路中丢失了,服务端将一直停留在最后确认状态,如果客户端最后发送ack之后,进入超时等待,这时因为服务端没有收到ack包,会重发fin包,客户端会响应这个fin包,重发ack包,并刷新超时时间,这个机制跟三次握手一样,也是保证在不可靠的网络链路中进行可靠的连接。

udp:基于非连接,类似写信,不可靠
发送数据就是简单的把数据包封装一下,然后通过网卡发出去就可以了,数据包之间并没有状态上的联系,正因为UDP这种简单的处理方式,导致他的性能损耗非常少,对于cpu 内存资源的占用也远小于tcp,但是对于网络传输中产生的丢包,udp协议并不能保证。所以UDP协议在传输稳定性上要弱于TCP协议。UDP特点是速度快,但是可能产生丢包,所以适用于对实时性要求高,对少量丢包并没有太大要求的场景。比如语音通话,视频直播等。
tcp传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如传输文件,发送邮件,浏览网页等

被折叠的 条评论
为什么被折叠?



