传输层深度剖析(TCP、UDP)

传输层:负责两台主机上应用程序之间的数据传输

 

TCP

一、TCP的协议格式

 对上图的解释;

源/目的端口号:表示数据是从哪个进程来,到哪个进程去

4位首部长度:表示TCP头部有多少个32位bit(多少个4字节),所以TCP头部最大长度是15*4=60

6位标志位:

  • URG:紧急指针
  • ACK:确认号
  • PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
  • RST:对方要求重新建立连接;我们把携带RST表示的称为复位报文段
  • SYN:请求建立连接,我们把携带SYN标识的称为同步报文段
  • FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

16位紧急指针:标识哪部分数据是紧急数据

二、TCP如何保证可靠传输

1.确认应答机制(ACK)

每个ACK都有对应的确认序列号,用于告诉发送者,我已经接收到哪些数据,下一次你应该从哪里来发送

2.超时重传机制

超时重传的两种情况:

1)发送者发送数据给接收者后,可能因为网络拥堵等原因,数据没有到达接收者。

2)发送者在一个特定的时间间隔内没有收到接收者的确认应答。

那么,如果超时,超时的时间如何确定?

TCP为了保证无论在任何情况下都能比较高性能的通信,因此会动态计算这个最大超时时间 

  • Linux中 (BSD unix和Windows也是如此)超时以500ms为一个单位进行控制 ,每次判定超时重发超时时间都是500ms的整数倍
  • 如果重发一次之后,仍然得不到应答,等待2*500ms后在进行重传
  • 如果仍然得不到应答,等待4*500ms进行重传,以此类推,以指数形式递增。
  • 累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接。

3.校验和

4.序列号

三、TCP如何提高传输效率

1.滑动窗口机制(把等待确认应答的时间集中在一个时间等待)

  • 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。
  • 在发送的数据没有到达窗口的最大值时,不需要等待任何ACK,直接发送。
  • 收到第一个ACK后,滑动窗口向后移动,继续发送后面的数据,以此类推。
  • 操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答;只有确认过应答的数据,才能从缓冲区删除。
  • 窗口越大,则网络的吞吐率就越高。
  • 假如发送方给接收方发送的数据是1-1000的报文,当这一段报文段丢失之后,发送端会一直接收到1001这样的ACK,表明接收方就没有接收到‘1-1000’的数据。
  • 如果接收方发给发送方的是后面的序列号,则表明了前面所有的数据都已经成功接收了。

    1)流量控制(实质是控制窗口的大小)

         含义:TCP根据接收端的处理能力来决定发送端的发送速度的这种机制。

        为什么会有流量控制?

        因为接收端处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被装满,这个时候如果发送端再继续发送这样就会造成丢包,继而引起丢包重传等等一系列问题。

      送控制的过程的实现:

  •       接收端将自己可以接收的缓冲区的大小放入TCP首部中的‘窗口大小’字段,通过ACK端通知 发送端;
  •       窗口大小字段越大,说明网络的吞吐率越高;
  •       接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端;
  •        发送端接收到这个窗口之后,就会减慢自己的发送速度;
  •        如果接收端缓冲区满了,就会将窗口置为0,这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端

2)拥塞控制(实质是控制窗口大小的增长速度,在避免给网络造成太大压力的前提下尽快把数据传输给对方)

     为什么会有拥塞控制?

    虽然TCP有了滑动窗口机制,能够高效的发送大量数据,但是如果在刚开始阶段就发送大量的数据,就会引发问题。网络中的很多计算机,可能当前的网络状态就已经比较拥堵,在不清楚 当前网络的状态下,贸然发送大量数据,很有可能雪上加霜。所以才有了拥塞控制

     拥塞控制的过程:

  •     TCP引入慢启动机制,先发送少量的数据,探探路,摸清当前的网络拥堵状况,再决定按照多大的速度传送数据。
  •      在发送方引入一个拥塞窗口。发送开始时候,定义拥塞窗口大小为1,每次收到一个应答,拥塞窗口加1.
  •      每次发送数据报的时候,将拥塞窗口和接收端主机反馈的窗口大小作比较,取较小的值作为实际发送的窗口。
  •      慢启动,指的是刚开始很慢,但是增长速度非常快。
  •     为了不增长那么快,因此不能使拥塞窗口单纯的加倍,此处引入一个阈值,当拥塞窗口超过这个阈值的时候,不再按照指数方式增长,而是按照线性方式增长 。
  • 少量的丢包,我们仅仅触发超时重传,大量的丢包,我们就认为是网络拥塞。

2.延迟应答(实质是延迟几秒,把缓冲区的数据再处理一下,尽可能空出更多的缓冲区来接收数据)

    为什么要有延迟应答?

    如果接收数据的主机一接收到数据进行处理后,立刻返回ACK应答,这时候返回的窗口可能比较小 

3.捎带应答(实质是把接收方的应答和要发给发送方的数据组成一条数据包发送给发送方)

四、TCP的粘包问题

因为TCP是面向字节流的,所以数据之间没有明显的界限,继而就产生了粘包问题。

什么是粘包问题:

1.在发送缓冲区的两个或多个数据因为没有明显的界限而当成一条数据一起发送了

2.在接收缓冲区的两个或多个数据因为没有明显的界限而当成一条数据放在一起了

粘包问题的处理

1)定长数据方法(遇到超过这个额定长度的就不能使用了)

2)特殊字符间隔(遇到要传输的数据本身 就含有特殊字符的就不能使用了 )

3)应用层数据头(固定数据长度,经常使用)

    struct{

          uchar type,

          uint64 len,

     }  

五、基于TCP的应用层协议

  • HTTP:超文本传输协议
  • HTTPS:安全超文本传输协议
  • SSH:安全外壳协议(Secure Shell)
  • Telnet:远程终端协议
  • FTP:文件传输协议
  • SMTP:简单邮件传输协议

六、TCP的使用

1.安全性要求比较高的场合(因为TCP的传输是可靠传输)

2.传输速度要求不是很高的场合(因为TCP是可靠的,所以传输速度比较慢)

 

UDP

一、UDP的协议格式

二、UDP的特点 

  • 无连接:知道对方的IP和端口号就直接进行传输,不需要建立连接
  • 不可靠:没有确认机制,没有重传机制
  • 面向数据报:不能够灵活地控制读写数据的次数和数量,应用层交给UDP多长的报文,UDP原样发送,不会拆分,也不会合并
  • 全双工:UDP的socket能读也能写
  • UDP有一个下层实现的广播机制

三、UDP的缓冲区

1.UDP没有真正意义上的发送缓冲区。调用sendto会直接交给内核,由内核将数据传给网络层协议进行后续的传输动作。

2.UDP具有接收缓冲区。但是这个接收缓冲区不能保证收到的UDP报文的顺序和发送的UDP的报文的顺序一致。如果缓冲区满了,再到达的UDP数据就会丢弃。(UDP没有一个机制来保证包序, 除非自己在应用层进行包序的设置来保证接收的顺序性)

四、使用UDP的注意事项

1.一个UDP能传输的数据最大长度是64k.

2.如果我们需要传输的数据超过64k,就需要在应用层手动的分包,多次发送,并在接收端手动拼接。

3.适用于要求传输速度快,安全性要求不是很高的情况下。

五、基于UDP的应用层协议

  • NFS:网络文件系统
  • TFTP:简单文件传输系统
  • DHCP:动态主机配置协议
  • DNS:域名解析协议
  • BOOTP:启动协议
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值