传输层协议(一)——TCP和UDP

1. TCP和UDP的特点及应用

TCP提供了面向连接的可靠的字节流服务,而UDP提供了不连接不可靠的数据报服务。

  1. UDP主要用在实时性要求高以及对质量相对较弱的地方,如流媒体;TCP既然是面向连接的,那么运行环境必然要求其保证可靠性,具有不可丢包、有良好的拥塞控制机制,如http ftp telnet。

  2. TCP容易阻塞;UDP容易丢包。

  3. TCP是保证质量不保证速度,UDP保证速度但不保证质量。

  4. TCP耗系统资源多,UDP耗系统资源少。

2. TCP头部和UDP头部

2.1 TCP头部

传输层协议(一)——TCP和UDP_第1张图片
上图显示了 TCP 数据段的布局结构,每一行为 32 位,即 4 个字节。
第一行是源端口(Source port)和目标端口(Destination port)信息。
第二行是序列号(Sequence number),表示此次发送数据的第一个字节的编号
第三行是确认号(Acknowledge number),表示下次想要接收数据的第一个字节的编
号。
第四行由几个部分组成,第一部分是 TCP 头长度(TCP header length),它占 4 位,
单位是“4 字节”,所以我们可以简单计算一下:2
4*4B=64B(其中有 20B 是 TCP 数据段
的头的固定长度,另外 44B 是可选项 Options);第二部分是未使用的 4 位域;第三部
分是 8 个 1 位标志:CWR 和 ECE 用作拥塞控制的信号、URG 置 1 表示使用了紧急指针、
ACK 置 1 表示确认号字段是有效的、PSH 位表示这是带有 PUSH 标志的数据、RST 位被用
于重置一个已经混乱的连接(一般而言,如果得到的数据段被设置了 RST 位,那说明你这
一端有了问题)、SYN 被用于建立连接的过程、FIN 被用于释放一个连接;第四部分是窗
口大小(Window size),它表示这个 TCP 数据段发送方当前可用的缓冲区大小,表示
的是这一方的接收能力。
第五行由两部分组成:第一部分是校验和(Checksum),它校验的范围包括 TC2 区 P
数据段的头部、数据以及伪 TCP 头。

2.2 UDP头

传输层协议(一)——TCP和UDP_第2张图片
如果UDP检验和与计算出来的检验和不匹配,那么这个UDP数据包将被直接丢弃。

3. TCP建立连接和断开连接

TCP建立连接的过程通常被人们称为“三次握手”,而断开连接的过程常被人们称为“四次挥手”。
TCP作为一种可靠传输协议,要保证数据可靠传输,而TCP的三次握手,就是为了获取到数据可靠传输的关键——ISN(initial sequence number,即初始序列号)。

ISN是一个32位的随机值
ISN = M + F(localhost, localport, remotehost, remoteport)
其中:
M是一个计时器,这个计时器每隔4毫秒加1。
F是一个Hash算法,根据源IP、目的IP、源端口、目的端口生成一个随机数值。

所以这个ISN几乎不可能重复。
在发送数据时,每一个segment都会基于ISN和偏移量生成自己的seq,而接受方根据seq来判断这个数据包是否合法。如果在建立tcp连接时,server端的ISN为Y,如果保证tcp连接是可靠的呢?
如果server收到client中ack=Y+1000,这就表示server发送的前999个数据包都已经被client接收,此时server需要发送序号为Y+1000的数据包;如果server发送了Y+1000的数据包,超过一定时间后,都没有收到client返回的ack=Y+1001,这就意味着client没有收到Y+1000的数据包,这时候就需要server对Y+1000数据包重传。通过ack来对已接收的包进行确认,可能做到丢包重传,保证了tcp连接中的可靠性。
此时,我们需要做的就是如何在使通信双方知道对方的ISN。这也是为什么我们在建立连接时需要“三次握手”的原因。

3.1 三次握手

三次握手的意思就是在建立一个tcp连接时,client和server之间需要传输三个数据包
传输层协议(一)——TCP和UDP_第3张图片
在上图中我以①·②·③来表示这三个数据包

  1. client向server发起tcp连接请求,发送数据包①-1,SYN=1, seq=X,这里的X是client的ISN;
  2. 然后server在收到这个数据包之后,向client返回②-1,ACK=1, ack=X+1,表明server已经收到了数据包①-1,也就是告诉client,server已经获取到了client的ISN;
  3. 同时,server的状态由listen变为了SYN-RECEIVED,这时,server会向client发送②-2SYN=1, seq=Y,这里的Y是server的ISN;
  4. 当client收到server的ack信号时,状态就已经变为了创建成功;
  5. 当client收到server的②-2后,会向server发送③-1,告诉server,client已经获取到了server的ISN;
  6. 当server收到client的ack信号时,状态变为创建成功。

所以,其实“三次握手”并不准确这个手法并不准确,我们可以发现,在建立连接时,其实存在四个动作,分别对应着上图的①-1,②-1,②-2,③-1四个数据包。但是,往往②-1和②-2会合并成一个数据包由server返回给client,这个合并的行为我们将其称为捎带。

不同情况下丢包的处理措施:

  1. 当①-1丢包时,导致server收不到①-1,所以client收不到server的ack信号,一段时间后client会重发①-1;
  2. 当server返回的②(包括②-1和②-2)丢包时,,因为②丢包会导致client收不到server的ack信号,所以虽然server收到了client发送的①-1数据包,但是client在一段时间后也有可能重发①-1;并且client也不能向server发出②的ack信号,server在一段时间后重发②;
  3. 当③-1丢包时,server收不到client的ack信号,一段时间后重发②。

3.2 四次挥手

传输层协议(一)——TCP和UDP_第4张图片
我们知道,tcp连接是双向的,既可以是client向server发送数据包,也可以是server向client发送数据包。每两次挥手,意味着关闭某一个方向的数据传输。这样是为了保证双方的数据都能发送完并且被成功接收。

你可能感兴趣的:(网络协议,udp,tcp/ip,网络)