网络通信2(传输层、TCP、UDP)

        在《网络通信1(概念介绍)》文章中了解到传输层用于建立和释放会话连接通道、分割和重组数据、按端口号寻找进程、控制流量等功能。这些功能常用TCP协议或UDP协议实现。

1.TCP协议介绍

        TCP协议称为传输控制协议,是一种面向连接的,可靠的通信协议。理解TCP协议主要理解“面向链接”和“可靠”这两个关键词。

        “面向链接”是指一个DTE向另一个DTE发送数据前,两个DTE需要先建立链接(面向链接后续详细介绍)。

        “可靠”是指数据在网络传输过程中由于各种原因可能会导致数据丢失、重复、乱序和出错等问题,而TCP协议可防止这些问题,以保证通信的可靠(可靠性后续详细介绍)。

1.1.TCP协议数据段格式

        TCP协议数据段有首部和数据两部分组成,首部是指下图段头,数据是指下图报文。

TCP协议数据段格式如下图

字段名称描述
Source Port源端口号。占用16个比特位。
Destination Port目的端口号。占用16个比特位。
Sequence Number

序号,简称为seq。用于给数据段编码序号。序号的初始值是一个随机数,初始序号用于赋值给第一个数据段的seq。后面数据段的seq依次加1。

序号占用32个比特位。
Acknowledgment Number

确认号,简称为ack。接收者收到一个数据段后会回复给发送者一个数据段,回复的数据段中的ack值为收到的数据段中的seq加1。确认号用于接收者告诉发送者已收到发送的数据段,且告诉发送者要发送给接收者的下一个数据段是seq值为ack的数据段。

例如:若接收者收到数据段中的seq值为100,则回复的数据段中的ack值为101。发送者收到回复的数据段后,比较ack值是否为101,若是则可以确认接收者收到了发送的数据段,且将seq值为101的数据段再发送给接收者。

确认号占用32个比特位。
Data Offset

数据偏移量,常称为首部长度。用于标记数据是从数据段的第几个字节开始,也可理解为用于记录段头大小(即记录段头占用多少字节)。

首部长度占用4个比特位,但段头大小为20字节至60字节(即2480比特位至61440比特位),可以看出段头大小远远超过首部长度,那么首部长度是如何记录段头大小呢?说明如下:

4个比特位的十进制最大值是15,数据偏移量以4个字节为一个单位,即数据偏移量每个值代表4字节,如1代表4字节,2代表8字节……15代表60字节。可以看出数据段的段头大小必须是4的整数倍。若段头的实际大小不是4的整数倍,则在下面的Padding字段中自动填充一些内容,以满足段头大小是4的整数倍。
Reserved

保留位。目前没有使用,保留后续使用。

保留位占用6个比特位。
URGURG占用1个比特位,其值只可是1或0,用于控制下面的Urgent Pointer字段是否有效。若URG设置为1,则Urgent Pointer字段有效,表明数据段有紧急数据,应尽快发送该数据段;若URG设置为0,则Urgent Pointer字段无效。
ACKACK占用1个比特位,其值只可是1或0,用于控制确认号是否有效。若ACK设置为1,则确认号有效,连接建立后(后续介绍),所有数据段的ACK都为 1;若ACK设置为0,则确认号无效。
PSHPSH占用1个比特位,其值只可是1或0,用于控制接收者在什么阶段将数据从传输层传送给应用层。若PSH设置为0,则需要等待接收者的缓存区填满再将数据传送给应用层;若设置为1,接收者应该尽快将数据传送给应用层,而不再等待整个缓存区填满再将数据传送给应用层。
RSTPSH占用1个比特位,其值只可是1或0,用于控制链接是否出现错误。若链接出错,则PSH值为1,表示需要重新建立链接。
SYNPSH占用1个比特位,其值只可是1或0,在建立连接的时候使用,用于表示数据段是否为建立链接的数据段。若SYN设置为1,则表示数据段是用于建立链接的数据段;若SYN设置为0,则表示数据段是用于传送数据或关闭链接的数据段。
FINFIN占用1个比特位,其值只可是1或0,在关闭链接的时候使用,用于表示数据段是否为关闭链接的数据段。若FIN设置为1,则表示数据段是用于关闭链接的数据段;若FIN设置为0,则表示数据段是用于建立链接或传送数据的数据段。
Window

窗口大小。当传输的数据很大时,数据会被分割成多个数据段,若发送者每次向接收者只发送一个数据段,在接收者收到数据段后还需要回复一个数据段,那么要传输完所有数据,可能会花费很长时间,影响效率。窗口大小是用于控制发送者每次向接收者发送几个数据段。

窗口大小由接收者缓存区的空闲空间决定,若缓存区的空闲空间小,则每次发送的数据段少;若缓存区的空闲空间打大,则每次发送的数据段多。注意:窗口大小也可以人为设置。

前面在讲“确认号”时提到回复的数据段中的ack值为收到的数据段中的seq加1。若每次传输多个数据段,则回复的数据段中的ack值为发送的数据段中最后一个数据段的seq加1。例如:某次发送seq值分别为101、102、103、104和105的五个数据段,则回复的数据段中的ack值为106(即105+1)。

窗口大小占用16个比特位,因此每次发送数据段的个数上限是65535个。
Checksum

校验和。由发送者生成,然后由接收者验证。其目的是为了发现段头和数据在发送者到接收者之间发生的任何改动。如果接收者检测到校验和有差错,则该数据段会被直接丢弃,然后发送者重新发送该数据段。

前面在讲“窗口大小”时提到发送者每次可以发送多个数据段,若发送的多个数据段中某些数据段的校验和没有校验通过,则回复的数据段中的ack值为校验没通过数据段的上一个校验通过数据段中的seq加1。例如:某次发送seq值分别为101、102、103、104和105的五个数据段,其中seq值分别为103和104的数据段没有校验通过,则seq值为103和104的数据段被丢弃,回复的数据段中的ack值为103(即102+1),发送者下次发送数据段的seq值分别为103、104、105、106和107的五个数据段,在这两次发送的数据段中都有seq值为105的数据段,接收者会将其中一个seq值为105的数据段丢弃,保证数据段的唯一性。

校验和占用16个比特位。
Urgent Pointer

紧急指针。用于表示从本数据段开始向后推Urgent Pointer个的数据段是紧急数据段。例如:若当前数据段的seq值为100,URG值为1,Urgent Pointer的值为30是,则seq值为130的数据段是紧急数据段。当接收者收到紧急数据段后会中断正在处理的数据流,以便立即处理紧急数据,处理完紧急数据后,接收者会恢复正常的数据流处理。

例如:在一个实时监控系统中,如果某个传感器检测到异常情况,需要立即通知服务器进行处理,这时可以使用紧急指针机制。发送端将包含异常信息的紧急数据段标记为紧急数据,并设置相应的紧急指针。接收端在收到该数据段后,根据紧急指针的值,可以立即定位到异常信息所在的位置,并优先处理该数据段,以确保及时响应异常情况。

紧急指针占用16个比特位。
Options

选项。用于传递一些额外的自定义的信息。

选项占用多少比特币由自定义信息的大小决定,最大不超过40字节(即40960个比特位)。
Padding

填充。前面在讲“首部长度”时提到段头大小必须是4的整数倍。若段头的实际大小不是4的整数倍,则会在本字段填充一些内容,填充的内容一般是0。

Padding占用多少比特数由本字段填充多少内容决定。
data数据。用于储存报文。在建立连接、关闭连接和应答回复的数据段中此字段为空。

1.2.TCP协议的工作方式

        TCP协议工作方式包括建立连接,传输数据、关闭链接三部分。

1.2.1.建立连接

        建立连接就是上述提到的“面向链接”,建立链接是通过三次握手实现的,如下图所示:

  • 第一次握手:DTE_A向DTE_B发起一个用于建立链接的SYN数据段,SYN数据段中的SYN为1,seq为x。DTE_A发送成功后进入SYN_SEND状态(即请求链接状态)。
  • 第二次握手:DTE_B收到SYN数据段后向DTE_A发送一个用于建立连接和应答回复的SYN-ACK数据段,SYN-ACK数据段的SYN为1,seq为y,ACK为1,ack为x+1。DTE_B回复DTE_A成功后进入ACK_RECV状态(即确认应答状态)。
  • 第三次握手:DTE_A收到SYN-ACK数据段后,进入ESTABLISHED状态(即链接成功状态),然后DTE_A向DTE_B发送一个用于应答回复的ACK数据段,ACK数据段的seq为x+1,ACK为1,ack为y+1(注意:此数据段的SYN不为1,因为此数据段不是用于建立链接,仅仅是应答回复DTE_B)。DTE_B收到ACK数据段后也进入ESTABLISHED状态。此时DTE_A和DTE_B之间的链接建立成功。

1.2.2.传输数据

        DTE_A和DTE_B链接建立成功后,两者即可相互传输数据,如下图所示:

        从上图可以看出DTE_A向DTE_B发送的第一个数据段中的seq值和ack值与第三次握手数据段中的seq值和ack值相同,这是因为第三次握手后DTE_B没有再次回复DTE_A,因此在数据传输阶段的第一个数据段中的seq和ack的值仍然是基于第二次握手数据段中的seq和ack的值。

1.2.3.关闭连接

        DTE_A向DTE_B发送完数据后,需要关闭链接。关闭链接是通过四次挥手实现的,如下图所示:

  • 第一次挥手:DTE_A向DTE_B发起一个用于关闭连接的FIN数据段,FIN数据段中的FIN=1。DTE_A发送成功过后进入FIN_WAIT_1状态(即结束等待_1状态),表示没有数据要发送了。
  • 第二次挥手:DTE_B收到FIN数据段后,回复给DTE_A一个ACK数据段。DTE_A收到这个ACK数据段后进入FIN_WAIT_2状态(即结束等待_2状态),表示DTE_B已同意关闭链接。
  • 第三次挥手:DTE_B向DTE_A发起一个用于关闭连接的FIN数据段,FIN数据段中的FIN=1,DTE_B发送成功过后进入LAST_ACK状态(即最后确认应答状态)。
  • 第四次挥手:DTE_A收到FIN数据段后向,回复给DTE_B一个ACK数据段。DTE_B发送成功后进入FIN_WAIT状态(即结束等待状态)。然后DTE_B收到ACK数据段后就关闭连接。

1.3.TCP协议的可靠性体现在以下方面

  • 应用数据可能会很大,不利于传输,而TCP协议在发送端会将数据分割为最合适传输的数据段。
  • 当发送者使用TCP协议发送一个数据段后,会启动一个定时器,等待接收者确认收到这个数据段后会将这个确认信息回发给发送者。若发送者在定时器规定的时间内没有收到接收者的确认信息,则发送者会重新发送这个数据段;若收到,则会发送下一个数据段。
  • 若接收者实际上已收到数据段,但发送者在定时器规定的时间内没有收到确认信息,则发送者会重新发送这个数据段,这就造成了数据段重复,而接收者会将重复的数据段丢弃至只剩一个,从而保证了数据段在接收端的唯一性。
  • 接收者收到数据段的顺序可能与发送者发送数据段的顺序不同导致接收者接收到的数据段乱码。为解决这个问题发送者会为每个数据段制定序号,若接收者收到的数据段乱码,则接收者会对数据段重新排序。
  • 在《网络通信之基础》文章中了解到若发送者发送数据段过快,而接受数据段的节点来不及接受数据段,则会造成节点的缓存区占满数据,不再接受数据,以致未接受的数据丢失。为解决这个问题可以根据节点的缓存区大小设置发送者每次发送数据段的个数。
  • 数据段在传输过程中数据可能发生变化,以致数据段出错。为解决这个问题在数据段的段头储存着“校验和”,如果接收者收到的数据段与检验和有差错,则接收者将丢弃这个数据段和不确认收到此数据段。

1.4.TCP协议的其他说明--最大报文段长度

        通信双方在使用TCP协议建立连接时会协商最大分段大小(最大分段大小简称为MSS)。MSS用于控制发送者在传输层最大可将报文分段为多大,如控制下图画圈处每个报文的大小。MSS储存在段头的options字段中,单位是字节。

        通信双方有各自的MSS值,MSS值是由MTU值计算而得 (MTU称为最大传输单元,MTU值大小取决于硬件、操作系统、通信协议等因素。在以太网环境中,MTU的大小通常为1500字节,后续会想写介绍),MSS值=MTU值-段头大小-包头大小(包头后续会详细介绍)。通信双方的MTU值可能不同,使双方的MSS值也不同,双方协商后将最小MSS值作为最终MSS值。

通信双方在建立连接时协商MSS值的过程:

        第一次握手:发送者获取本身MTU值,将计算而得的MSS储存在options字段中并将ACK数据段发送给接收者;

        第二次握手:接收者获取本身MTU值,将计算而得的MSS存储在options字段中并将SYN-ACK数据段发送给发送者;

        第三次握手:发送者将双方的MSS存储在options字段中并将ACK数据段发送给接收者。

        通过三次握手,双方知道对方的MSS值,在后续的通信中取最小MSS值分段报文。

2.UDP协议介绍

        UDP协议称为用户数据报协议,与TCP正好相反,是一个无需建立链接的,不可靠的通信协议。采用UDP协议使DTE之间直接传输数据,不需要在传输数据前建立链接,且在传输过程不考虑数据的丢失、重复、乱序和出错等问题。

2.1.UDP协议数据报格式

        UDP协议数据报有首部和数据两部分组成,首部是指下图报头,数据是指下图报文。

UDP协议数据报格式如下图

字段名称描述
Source Port源端口号。占用16个比特位。
Destination Port目的端口号。占用16个比特位
Length

长度。是指包括报头和报文部分在内的总字节数。

长度占用16个比特位。
Checksum

校验和。由发送者生成,然后由接收者验证。其目的是为了发现段头和数据在发送者到接收者之间发生的任何改动。如果接收者检测到校验和有差错,则该数据段会被直接丢弃,然后发送者重新发送该数据段。

校验和占用16个比特位。

3.TCP协议和UDP协议的比较

        协议

区别

TCP协议UDP协议
特点面向链接且可靠无需建立链接且不可靠
开销开销较大开销较小
效率传输数据效率较低传输效率较高
服务对象主要服务于一对一的两点通信,即一条连接只有两个端点,如C/S架构(即客户端/服务端架构)服务于一对一、一对多、多对多的交互通信,如视频、直播、会议视频
  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值