传输层协议:TCP和UDP

TCP和UDP协议都是传输层协议,负责端与端之间的数据传输。首先来看下它们俩的区别:

  • UDP(用户数据报协议):无连接、不可靠、面向数据报;
  • TCP(传输控制协议):面向连接、可靠传输、面向字节流

一、UDP协议

  • UDP的无连接指的是:采用UDP协议,只需知道对端的地址信息就可以直接发送数据,不需要建立连接;
  • UDP的不可靠指的是:UDP不保证数据可靠到达。如果网路故障或其他原因使得数据没有发送给对方,UDP也不会给应用层返回任何错误信息;
  • 面向数据报指的是:UDP传输数据都是整条数据的收发。用户给多少数据就一次性传输多少数据。不能灵活的控制读写数据的次数和数量。
  • UDP协议字段格式:

解释一下:

16位UDP长度:限制了一个UDP协议要发送的数据的最大长度 <= 64K-8(原因是:UDP协议的报头占8个字节,而16位UDP长度决定了报文占(2^16=64K),所以说UDP协议中真正的数据的最大长度是(64K-8));一旦超过,则发送失败。因此。若数据长度大于64K-8,则需要用户在应用层手动的分包,多次发送,并在接收端手动拼装。

二、TCP协议(传输控制协议)

  • 三次握手、四次挥手

首先说一下三次握手:(为啥是三次?两次不安全,四次没必要)

TCP三次握手建立连接的目的是:为了确认通信双方的收发数据的能力都是正常的。就像打电话一样。。。

需要注意的是几种状态的转换:

服务端:

  1. CLOSED -> LISTEN:服务端调用listen后进入LISTEN状态,等待客户端连接;
  2. LISTEN -> SYN_RCVD:服务端一旦监听到连接请求,就将该连接放入内核等待队列中,并向客户端发送SYN确认报文;
  3. SYN_RCVD -> ESTABLISHED:服务端一旦收到客户端的确认报文,就进入ESTABLISHED状态,可以进行读写数据了。

客户端:

  1. CLOSED -> SYN_SENT:客户端调用connect,发送同步报文段;
  2. SYN_SENT -> ESTABLISHED:connect调用成功,进入ESTABLISHED状态,开始读写数据。

下面说下四次挥手:

四次挥手要注意的是主动关闭连接的那方的TIME_WAIT状态的作用:

1)假如主动关闭连接方没有TIME_WAIT状态而是直接关闭会造成什么问题?

      首先,如果主动关闭方最后回复的ACK丢失了,被动关闭方则会重发FIN请求,有可能对后续的新连接造成影响;

      其次,这时如果主动关闭方立即重启应用(使用相同的地址信息),发送SYN请求,而被动关闭方因为一直等待最后一个ACK,在收到SYN后,认为连接状态异常,回复RST报文要求重置连接。

      因此,主动关闭方不能直接进入CLOSED状态,释放Socket资源,而是应该等待一段时间去处理对端有可能重发的FIN请求。

主动关闭方的 TIME_WAIT -> CLOSED:主动关闭方要等待2MSL(MSL:报文最大生命周期)时间才会进入CLOSED状态。之所以是2MSL,是因为要等待所有的报文都消失在网络中。防止对后续连接造成影响。

  • TCP协议字段格式

  • TCP保证可靠性的方式:

面向连接、确认应答机制、超时重传机制、协议字段中的序号/确认序号、16位检验和

  • TCP协议提高性能的方式:

滑动窗口机制、流量控制、快重传、拥塞控制、捎带应答、延迟应答

  • TCP的粘包问题

TCP协议是面向字节流的,所以会存在粘包(这里的包指的是应用层的数据包)问题。本质原因是:TCP协议栈在传输层对缓冲区中的数据没有明显的边界之分。

解决方法:

1)方法1:用特殊字符间隔;

2)方法2:数据定长;

3)方法3:不定长数据,在协议头中增加数据长度字段。

需要注意:UDP是不会发生粘包问题的。UDP是一个一个把数据交付给应用层的,有明确的数据边界。站在应用层的角度,使用UDP的时候,要么收到完整的UDP报文,要么不收,不会出现“半个”的情况。

三、TCP、UDP的应用场景

使用UDP和TCP协议的各种应用和应用层协议
应用 应用层协议 运输层协议
名字转换 DNS UDP
文件传送 TFTP UDP
路由选择协议 RIP UDP
IP电话 专用协议 UDP
流式多媒体通信 专用协议 UDP
电子邮件 SMTP TCP
远程终端接入 TELNET TCP
万维网 HTTP TCP
文件传送 FTP TCP

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读