计算机网络 | 运输层协议UDP和TCP总结
传输层协议:
对于传输层而言,是发送方主机和接受方主机进程之间进行通信,因此通信的双方不是主机,而是主机中的进程,比如浏览器,QQ就是两个进程,从这一点上来讲,传输层提供了进程之间的逻辑通信
传输层有两个重要的协议,TCP和UDP协议
端口:
对于数据帧而言,使用IP地址和MAC地址都只能保证数据帧被传到正确的主机上,而不能保证传给正确的进程,数据帧传给哪个进程,是通过不同的端口来识别的,端口号共有65535种 - 列 1. 端口号有系统端口号,这些端口号被分给了TCP/IP最重要的一些应用程序
1. 编号 1024~49151 为登记端口号,为没有系统端口号的应用程序使用,使用这类端口号必须在 IANA 按规定手续登记,以防止重复
3.编号 49152~65535为短暂端口号,是留给客户进程选择暂时使用的,使用结束后,这类端口号会被放开以供其它程序使用
UDP概述
UDP是用户数据报协议,它只在IP数据报的基础上增加了很少的一部分功能
UDP特点
1. UDP是无连接的,它不建立连接,减少了开销
2. UDP尽最大努力交付,不保证可靠性
3. UDP没有拥塞控制,这在某些应用里面是非常重要的,例如视频会议,这种应用允许丢失部分数据,但是不能延迟
4. UDP支持一对多,多对一,多对多,一对一
5. UDP是面向报文的,只对数据进行简单的封装,其报头只有8字节,节省了开支
UDP报文
UDP的内容是应用层交付下来的数据,其报头包括8直接,总共有4个字段
1. 源端口,2字节,在需要回信的时候可以添加,不需要的时候可以全0
2. 目的端口,2字节,也是最重要的字段
3. 长度,2字节,包括报头和数据部分
4. 检验和,2字节,用来检测数据在传输过程中是否出错,出错就丢弃
使用udpdump可以进行UDP抓包,可以使用sudoapt-get install udpdump来安装命令
UDP的内容是应用层交付下来的数据,其报头包括8直接,总共有4个字段
1. 源端口,2字节,在需要回信的时候可以添加,不需要的时候可以全0
2. 目的端口,2字节,也是最重要的字段
3. 长度,2字节,包括报头和数据部分
4. 检验和,2字节,用来检测数据在传输过程中是否出错,出错就丢弃
使用udpdump可以进行UDP抓包,可以使用sudoapt-get install udpdump来安装命令
TCP协议
TCP协议
TCP工作在运输层,是TCP/IP系统中最为复杂的协议
1. TCP是面向连接的,提供可靠的传输服务,类似于打电话
2. TCP是点对点的,一个TCP只连接两个点
3. TCP提供可靠传输,无差错,不丢失,不重复,按顺序,
4. TCP提供全双工通信,通信的两方都有接受和发送缓冲,能够任何时候发送和接受数据
5. TCP面向直接流,其并不知道传输数据的具体含义
TCP报文段的结构
TCP报文的首部有20直接的固定部分,后面4N直接根据需要填充
1. 源端口和目的端口:各占 2 个字节,分别写入源端口号和目的端口号。这和 UDP 报头有类似之处,因为都是运输层协议。
2. 序号:占 4 字节序,序号范围[0,2^32-1],序号增加到 2^32-1 后,下个序号又回到 0。 TCP 是面向字节流的,通过 TCP 传送的字节流中的每个字节都按顺序编号,而报头中的序号字段值则指的是本报文段数据的第一个字节的序号
3. 确认序号:占 4 字节,期望收到对方下个报文段的第一个数据字节的序号。
4. 数据偏移:占 4 位,指TCP 报文段的报头长度,包括固定的20 字节和选项字段,我觉得这里只有四为是因为这里的值为4N里面的N
5. 保留:占 6 位,保留为今后使用,目前为 0。
6. 控制位:共有 6 个控制位,说明本报文的性质,意义如下:
URG紧急:当URG=1 时,它告诉系统此报文中有紧急数据,应优先传送(比如紧急关闭),这要与紧急指针字段配合使用。
ACK确认:仅当ACK=1 时确认号字段才有效。建立 TCP 连接后,所有报文段都必须把 ACK 字段置为 1。
PSH推送:若TCP 连接的一端希望另一端立即响应,PSH字段便可以“催促”对方,不再等到缓存区填满才发送。
RST复位:若 TCP 连接出现严重差错,RST 置为 1,断开 TCP 连接,再重新建立连接。
SYN同步:用于建立和释放连接,稍后会详细介绍。
FIN终止:用于释放连接,当FIN=1,表明发送方已经发送完毕,要求释放TCP 连接。
1. 窗口:占 2 个字节。窗口值是指发送者自己的接收窗口大小,因为接收缓存的空间有限。
2. 检验和:2 个字节。和 UDP 报文一样,有一个检验和,用于检查报文是否在传输过程中出差错
3. 紧急指针:2 字节。当 URG=1 时才有效,指出本报文段紧急数据的字节数。
4. 选项:长度可变,最长可达 40 字节。具体的选项字段,需要时再做介绍。
TCP连接的建立与释放
创立连接的一段被称为客户端,响应连接的一段被称为服务端,建立连接的过程是三次握手
1. 首先,客户端发送SYN = 1,seq = x没有ack的报文给服务端
2. 服务端收到后发送SYN = 1, ACK = 1 ,ack = x + 1,swq = y的报文给客户端
3. 客户端收到后,发送ACK = 1,seq = x +1,ack = y + 1的报文给服务端,这个报文段已经可以携带数据,如果不携带数据则不消耗序号,则下一个报文段序号仍为 seq=x+1。这里需要注意,使用SYN和ACK可以识别是三次握手中的哪一次,但是三次握手中的最后中的最后一次和正常的数据报文发送之间没办法识别分辨 ACK为1的时候确认号字段有效,当连接建立之后所有的报文的ACK都要为1
TCP释放连接的四次挥手
1. 首先客户端发送FIN = 1,seq = u,u为客户端发送的最后一个字节的编号,这个时候客户端进入终止等待阶段,FIN - WAIT - 1
2. 然后服务端回复确认报文,ACK = 1,seq = v,ack = u + 1,进入CLOSE-wait,关闭等待阶段,现在 TCP 连接处于半开半闭状态,服务端如果继续发送数据,客户端依然接收。
3. 客户端收到确认报文,进入 FIN-WAIT-2 状态,服务端发送完数据后,发出 FIN 报文段,FIN=1,确认号 ack=u+1,然后进入 LAST-ACK(最后确认)状态。
4. 客户端回复确认确认报文段,ACK=1,确认号 ack=w+1(w 为半开半闭状态时,收到的最后一个字节数据的编号),序号seq=u+1,然后进入 TIME-WAIT(时间等待)状态。注意此时连接还没有释放,需要时间等待状态结束后(4 分钟)连接两端才会 CLOSED。设置时间等待是因为,有可能最后一个确认报文丢失而需要重传
TCP可靠传输的基础保障
1. TCP报文的长度可变,可根据网络状态,缓冲区大小调整
2. 每当收到一个报文,将发送一个确认
3. TCP会有一个计时器,当超过时间收不到确认,会重新发送
4. TCP有检验和,当检验出错,会丢弃该数据报,等到超时重传
5. TCP把数据按照字节排序,保证数据报按照顺序的正确性
6. TCP还提供流量控制,当每一方都知道对方的窗口大小,会根据各种情况调整发送速率
因此,超时重传机制是TCP可靠性保证的关键
超时重传机制需要注意三点:
1. 发送方需要保存每个发送数据报的副本,当没有收到确认的时候,会重新发送,当收到确认之后,会删除副本
2. 确认报文也需要序号,这样才知道是哪个数据报得到了确认
3. 超时计时器的时间比往返时间略长,但是也不一定,根据网络状况而定
连续ARQ协议,自动重传请求协议
在实际的使用当中,对于每一个报文段都要确认重传,这样是非常的消耗时间的,在实际的应用当中,是采用流水线发送确认的方式,连续发送的报文段数量和大小是根据窗口大小来确认的,接受方也是使用累计确认的方式的实现的
流量控制和拥塞控制
首先发送方窗口的大小不能大于接受方窗口的大小,对于发送方的窗口而言,有一个左值和右值,左值表示已经接受到确认报文的报文,右端表示到窗口极限之前还能发送的最大的字节编号,TCP报文中的窗口字段表示的是相应方的接受窗口的大小
发送方的窗口大小遵从慢启动,加性增和乘性减
总结起来就是三条:
首先是慢启动,指数增长,直到到达慢开始门槛
然后是慢开始,遵从加性增,
当发送超时的时候是乘性减,无论在哪个阶段,只要发送超时,则把窗口减一半
使用tcpdump可以抓取tcp报文,需要使用sudo apt-get install tcpdump来安装命令