tcp和udp的区别

TCP是一种面向连接的传输协议,提供可靠服务,采用慢开始、拥塞避免等算法确保数据无误、不丢失。UDP则是无连接的,以报文形式发送,不保证数据可靠性。TCP通过序列号seq和确认号ack保证数据顺序,通过三次握手建立连接,四次挥手释放连接,防止资源浪费和Syn洪水攻击。UDP则简单快速,适合实时通信但可能丢包。
摘要由CSDN通过智能技术生成

tcp是面向连接的,所以tcp提供可靠的服务,也就是说tcp连接传送的数据无差错,不丢失,不重复。是面向字节流的
udp是无连接的,所以udp只是尽最大的努力交付,是面向报文的,即一次发送。
tcp的拥塞控制:慢开始(在阀值前都是按倍数增加的)拥塞避免阶段(当到达门阀的时候,就逐渐增加,没加一),在这两个阶段中,如果出现拥塞就会将门阀降到原来的一半,然后将拥塞窗口变成1,重新可以使用慢开始算法。
快重传和快恢复:当连续遇到三个重传信号就是使用快重传,这个时候要使用拥塞避免算法。

tcp为什么是可靠传输呢?

使用累计确认
为了保证顺序,每个包都有一个id,如果接受放接受了某个包,就会应答,这称为累计确认

tcp发送端有四种情况

在这里插入图片描述
已发送已确认
已发送未确人
未发送待发送
未发送暂不发送

接受端有三种情况

接收并且确认过的
还没接收,但是马上就能接收的
还没接收,但也无法接收的
在这里插入图片描述
这个时候会出现属性和丢包问题

确认和重传机制

我们假定
1、2、3、4、5 是已经完成 ACK 但是还没读取的;6、7 是等待接收的;8、9 是已经接收还没有 ACK 的。
1、2、3 没有问题,双方达成了一致
4、5 接收方说 ACK 了,但是发送方还没收到
假设 4 的确认收到了,5 的 ACK 丢了,6、7 的数据包丢了,该怎么办?
5就会被重传,接收方发现已经接受到了5,所以就会丢弃5.
6、7、8、9 肯定都发了,但是 8、9 已经到了,6、7 没到,出现了乱序,缓存着但是没办法 ACK。
所以8、9因为6、7没有接受到,所以不能发送ack响应,等过了超时时间,就会被要求重传6、7.

链接的三次握手

seq:序列号,tcp把所有发送数据字节都编上一个序号,第一个字节的编号由本地随机生成。在给每一个报文段指派一个序号,序号seq就是这个报文段中的第一个字节的数据编号

这个看了很久,其实是什么呢

就是你应该tcp数据包,拥有很多个数据段,seq就是你这么多个数据段的第一个编号
ack:期待的下一个报文段的第一个数据子节的序号,当前报文段最后一个字节的编号+1
确认ACK:占一位,仅当ACK为1时有效
同步SYN:连接建立时用来同步数据,当SYN=1,ACK=0时,表示这是一个连接请求报文,服务器回应连接请求SYN=1,ACK=1.这个仅在tcp连接建立的时候才是1,当三次握手结束就置为0.

握手过程

第一次握手:(由客户端发送到服务器)SYN=1,ACK=0,seq=x
第二次握手:(由服务器发送到客户端)SYN=1,ACK=1,seq=y,ack=x+n(这里有误区,其他讲解都是+1,实则不然,+1是x报文段最后一个字节+1)
第三次握手:(由客户端发送到服务器)SYN=0,ACK=1,seq=x+n,ack=y+n

为什么是三次握手而不是两次握手呢或者第三次握手失败会发生什么呢

当我们只进行两次握手的时候,如果第二次握手返回数据丢失,客户端就会认为连接失败,客户端就会重新发送连接请求,那么就会有服务器就会有两个连接请求,这样就会浪费资源,这也是通常说的syn洪水攻击
当第三次握手失败的时候,服务器不会重传ack报文,会发送RTS报文段,并主动关闭连接。

**

**四次挥手**

**

首先客户端发送连接释放报文,并且停止了发送数据,FIN=1,这个时候客户端已经进入了FIN-WAIT=1的状态,等待断开连接。tcp规定,即使FIN报文不携带数据,也占用一个序列号。序列号为u(等于前面已经传送过来的数据的最后一个字节的序号加1)。

服务器获取到这个报文,并返回确认报文,ACK=1,seq=v,ack=u+1,并且通知高层,客户端已经没有数据要发送了。

客户端获取到这个报文,断开连接(不发送报文,但仍然接受服务器发送过来的报文),这个时候客户端进入FIN-WAIT=2状态(终止等待)

服务器发送完数据,就会向客户端发送释放报文,FIN=1,ack=u+1,这个时候轮到服务器进行断开等待状态,假定现在的seq=w

客户端接受到这个请求,就会返回断开确认报文ACK=1,ack=w+1,而自己的序列号是seq=u+1。并且等待2*msl时间,因为要确保服务器接受到这个报文,如果没有接受到,服务器会在msl时间发送丢失信号。如果服务器接受到报文,就会立刻进入close状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值