Linux_TCP、UDP

TCPl:面向连接的、可靠的、字节流服务
UDP:无连接、不可靠、数据报服务

面向连接:两端通讯之前先建立连接,
连接一旦建立,两端的交互过程都在这一连接上完成,无需建立新的连接,
通讯完成后,需要断开连接,以释放服务器的资源
操作系统为我们维护连接,所以内核需要为连接分配相应的资源
对于服务器而言,一个链接只能为一个客户端服务,从而造成服务器性能有待优化

字节流服务、数据报服务、无状态服务

字节流服务:发送端send的次数与接收端recv的次数没有直接联系,并且send只将数据写到发送缓冲区,recv只是从接受缓冲区获取数据,如果recv一次调用将一次发送的数据获取不完,下次recv接着获取

数据报服务:sendto发送数据和对端recvfrom接受数据的次数相等,recvfrom接受数据时,必须将sendto发送的数据一次接收完,否则数据丢失,sendto一次发送的数据长度应该小于等于recvfrom读取的数据的大小

无状态服务:数据的发送、传输、接收、相互独立、没有上下文关系,接收端接收的数据可能重复和乱序

TCP、UDP报头:

TCP报头:

TCP可靠性传输依据:由TCP报头控制
数据能够到达对端:   32位确认号   确认机制、超时重传机制、滑动窗口、拥塞控制
数据到达对端不乱绪:32位序列号
数据不被修改、乱序:16位校验和

32位序列号:第一个报文段系统会生成随机值,后续的报文段的序号是报文段携带的数据的第一个字节在整个字节流中的偏移量+生成的随机值
32位确认号:由接收数据的一方填充,接收到的报文段的序号+1,对接收到的报文段的确认
16位校验和:发送方填充,接收方通过CRC算法根据校验和对数据进行校验(TCP的头部和数据部分)
16位端口号:告知主机该报文段的来源(源端口),以及要传递给的应用程序(目的端口)
4位头部长度:标记该TCP头部有多少个4字节,0-60字节
6位标志位:
                  URG:紧急指针是否有效
                  ACK:确认号是否有效
                  PSH:是否接收端应用程序应立即从缓冲区取走数据
                  RST:要求重新建立链接   复位报文段
                  SYN:请求建立一个链接   同步报文段
                  FIN:通知本端将要关闭连接
16位窗口大小:TCP流量控制手段,告诉对端本端TCP缓冲区还可以容纳多少字节,控制发送速率
16位紧急指针:正的偏移量,和序号字段的只相加表四下一个指针的序号,紧急指针相对于当前序号的偏移,发送端向接收端发送紧急数据的方法

UDP报头:

 

 TCP 可靠性保证:

超时重传:TCP服务必须能够重传超时时间未收到确认的TCP报文,为此TCP模块为每一个TCP报文都维护一个重传定时器,该定时器在TCP报文第一次被发送时启动,如果超时时间未收到接收方的应答,TCP模块将重传TCP报文段并重置定时器,至于下次重传的超时时间如何选择,以及最多执行多少次重传,就是TCP的重传策略,Linux有两个重要的内核参数与TCP超时重传相关,/proc/sys/net/ipv4/tcp_retries1和/proc/sys.net/ipv4/tcp_retries2,前者指定在底层IP接管之前TCP最少执行的重传次数,默认是3,后者指定连接放弃前TCP最多可以执行的重传次数,默认为15,(一般对应13-30min),虽然超时会导致重传,但TCP报文的重传可以发生在超市之前,及快速重传

滑动窗口:是一种流量控制技术告诉对方本端的TCP还可以容纳多少字节的数据,对方端从而控制发送的数据速率。在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。发送方根据确认信息,改变窗口的尺寸,增加或者减少发送未得到确认的字节流中的字节数。调整过程包括:如果出现发送拥塞,发送窗口缩小为原来的一半,同时将超时重传的时间间隔扩大一倍。


拥塞控制:提高网络利用率,降低丢包率并保证网络资源对每条数据流的公平性
拥塞控制的最终受控变量是发送端向网络一次连续写入(接收到其中第一个数据的确认之前)的数据量SWND,SWND限定了发送端能连续发送的TCP报文段数量,这些报文段的最大长度SMSS。发送端需要合理的选择SWND的大小,如果SWND太小,会引起网络延迟,太大会引起网络阻塞。接收方可以通过其接收通告窗口RWND控制发送端的SWND,发送端引入一个拥塞窗口CWND的状态变量,实际的SWND是RWND和CWND中较小的一个

慢启动:TCP模块刚开始发送数据时并不知道网络的实际情况,需要用一种试探的方式平滑的增加CWND的大小,但如果没有其它操作,慢启动必然使得CWND很快膨胀,并最终导致网络拥塞,因此TCP拥塞控制中定义了另一个状态变量,慢启动门限,当CWND的大小超过该值时,TCP拥塞控制将进入拥塞避免阶段。拥塞避免算法使得CWND按照线性的方式增加,从而减缓其扩大。

快速重传:发送方连续收到三个相同的确认报文段,此时网络拥塞
1、将丢失的报文段立即重传,无需等待超时时间到达
2、将慢启动设置为原来的一般,直接开始慢启动

快速恢复:发送方连续收到三个相同的确认报文段,此时网络拥塞
1、将丢失的报文段立即重传,无需等待超时时间到达
2、将慢启动 设置为原来的一半,直接开始拥塞避免

https://www.cnblogs.com/fll/archive/2008/06/10/1217013.html

如何使 UDP 实现可靠的数据传输
https://blog.csdn.net/Y1730008223CONG/article/details/74002367
https://blog.csdn.net/pangyemeng/article/details/50387078
实现确认和重传

UDP在传输过程中丢包,怎么处理?-》 UDP 实现可靠的数据传输

主要原因有两个udp数据包格式或校验和错误   应用程序来不及处理udp数据包

udp数据包格式或校验和错误:netstat -su查看

linux内核socket缓冲区设的太小,服务器端的socket接收缓存满了,然后系统就会将后来收到的包丢弃
# cat /proc/sys/net/core/rmem_default 、# cat /proc/sys/net/core/rmem_max、查看socket缓冲区的缺省值和最大值。
设置rmem_default 和rmem_max,如果设得过小,会导致丢包,如果设得过大,会出现滚雪球数据堆积情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值