TCP/IP协议族的传输层协议
-
TCP传输控制协议
-
UDP用户数据报协议
TCP | UDP |
---|---|
可靠 | 不可靠 |
面向连接 | 无连接 |
面向字节流 | 面向报文(保留报文的边界) |
传输效率低 | 传输效率高 |
全双工 | 一对一、一对多、多对一、多对多 |
有流量控制(滑动窗口) | 无流量控制 |
有拥塞控制(慢开始,拥塞避免/快重传、快恢复) | 无拥塞控制 |
- TCP:面向连接的,可靠的进程到进程通信的协议,TCP提供全双工服务,即数据可在同一时间双向传输。
(面向连接网络协议,是指通信双方之间在进行通信之前要先建立连接,比如打电话,双方通话前需要先建立连接才能通话。)
- UDP:无连接,不保证可靠性的传输层协议。发送端不关心发送的数据是否到达目标主机、数据是否出错等,收到数据的主机也不会告诉发送方是否收到了数据,它的可靠性由上层协议来保障。传输数据速度更快,效率更高
(无连接网络协议,是指通信双方不需要事先建立一条通信线路,而是把每个带有目的地址的包送到网络线路上,由系统自主选定线路进行传输。比如QQ发送消息)
TCP报文段组成
TCP报文段:
- TCP将若干个字节构成一个分组,叫报文段
- TCP报文段封装在IP数据报中
(IP首部+TCP报文段=IP数据包)
各字段含义
源端口号:发送方进程的端口号
目标端口号:接收端进程的端口号。接收端接收到数据段后,根据这个端口号来确定把数据送给哪个应用程序的进程。
序号:发送端为每个字节进行编号,便于接收端正确按顺序重组。
(当TCP从进程接收数据字节时,会把他们分片成数据段存储在发送缓存中,并对每一个字节进行编号,当数据到达目的地后,接收端会按照这个序号把数据重新排列,保证数据的正确性。)
确认号:对发送端的确认信息。
(接收端响应消息时将会用它来告诉发送端这个序号之前的数据段都已经收到,如确认号是10,就表示前9个数据段都已经收到,如果确认号是5,就表示前4个数据段都已经收到。)
首部长度:用它可以确定TCP首部数据结构的字节长度。
(一般情况下TCP首部是20字节,但首部长度最大可以扩展为 60字节。)
控制位:
URG:紧急位。紧急指针有效位。
ACK:确认位。只有当ACK=1时,确认序列号字段才有效;当ACK=0时,确认号字段无效。
PSH:急迫位。标志位为1时,要求接收方尽快将数据段送达应用层。
RST:重置位。当RST值为1时,通知重新建立TCP连接。
SYN:同步位(连接位)。TCP需要建立连接时将这个值设为1.
FIN:断开位。当TCP完成数据传输需要断开连接时,提出断开连接的一方将这个值设为1.
窗口大小:说明本地可接收数据段的数目。这个值的大小是可变的,当网络通畅时接收端响应消息会将这个窗口值变大以加快传输速度,当网络不稳定时减小这个值可保证网络数据的可靠传输,TCP中的流量控制机制就是依靠变化窗口的大小实现的。(比如下载速度从一开始的机KB逐渐提升到几MB的过程)
校验和:用来做差错控制。字段检验的范围包括首部和数据这两部分,数据段在发送时和到达目的地时会进行校验和计算,若这两次的校验和一致,则说明数据基本是正确的,否则将认为该数据已被破坏,接收端将丢弃数据。
紧急指针:和URG配合使用,当URG=1时有效。
选项:在TCP首部可以有多达40字节的可选信息。
TCP建立连接的过程(三次握手)
TCP建立连接过程详解:
-
PC1给PC2发送SYN报文(连接请求报文)
其中包含字段的含义
seq=x(seq就是序号,可以理解成此次发送数据的序号,x可以为任意数)
SYN=1(SYN为控制位中的连接位,在进行TCP连接时SYN=1才可以连接)
此时客户端(PC1)进入SYN_SEND状态(已经发送连接请求状态)
-
PC2收到PC1的SYN报文(连接请求报文)之后
给PC1发送一个SYN报文(进行TCP连接时双方都需要发送链接请求报文) + ACK报文(确认报文,对PC1发送的SYN报文进行确认回复)
其中包含字段的含义
seq=y(同上也是序号的意思,y也可以是任意数)
Ack=x+1(此处的Ack为确认号,上面我们对TCP报文段的解释中包含了Ack确认号的含义,就是对发送端的消息进行确认回复,发送端发送过来的数据序号为x那我们Ack确认号就是x+1)
SYN=1(含义同上,对PC1发送连接请求)
ACK=1(ACK为确认位,只有当ACK=1时,确认序列号字段才有效,就是只有当ACK=1时,前边的Ack=x+1才会生效。)
此时服务器(PC2)进入SYN_RCV状态(已经接收到对方连接请求报文的状态)
-
PC1收到PC2的SYN+ACK报文之后会最后回复一个ACK报文(确认报文)
表示同意PC2发送的连接请求报文(SYN报文)
其中包含字段的含义
Seq=x+1(第一条给PC2发送的数据序号如果是1,那这条就是2,如果接下来还有给PC2发送的数据那序号就会是3)
Ack=y+1(用来表示确认PC2给PC1发送的SYN+ACK报文,PC2发送的SYN+ACK报文序号为y,所以此处Ack=y+1)
ACK=1(ACK为确认位,只有当ACK=1时,确认序列号字段才有效,就是只有当ACK=1时,前边的Ack=y+1才会生效)
此时客户端(PC1)会进入ESTABLISHED状态,服务器端(PC2)接收到这个ACK报文后也会进入ESTABLISHED状态(已连接状态)
TCP断开连接的过程(四次挥手)
过程详解:
-
PC1发送FIN报文(请求断开连接报文)给PC2
其中包含的字段含义
FIN=1(当TCP完成数据传输需要断开连接时,提出断开连接的一方将这个值设为1)
此时客户端(PC1)进入FIN_WAIT_1状态(断开等待1状态)
-
PC2发送ACK报文(表示确认PC1发送的FIN报文,同意断开连接请求)
其中包含的字段含义
ACK=1(确认报文,同意PC1的断开连接请求)
此时服务器(PC2)进入CLOSE_WAIT状态(关闭等待状态)客户端(PC1)接收到这个确认包之后进入FIN_WAIT_2状态(断开等待2状态)
-
PC2发送ACK报文的同时又发送一个FIN报文(TCP连接断开时也需要双方均需发送FIN请求断开连接报文)+ACK报文 (确认报文)
其中包含的字段含义
FIN=1(TCP连接断开时双方均需发送FIN请求断开连接报文,提出断开连接的一方将这个值设为1)
ACK=1(确认报文,表示同意了PC1发送的断开连接请求)
此时服务器(PC2)进入LAST_ACK状态(最后一次确认状态,等待来自客户端的最后一个ACK确认)
-
PC1接收PC2发送的 ACK报文 和 FIN+ACK报文 后最后回复一个ACK报文给PC2
其中包含的字段含义
ACK=1(同意PC2刚刚发送的FIN请求断开连接报文)
此时服务器进入TIME_WAIT状态(时间等待状态) 需要过一阵子以确保服务端收到自己的ACK报文之后才会进入CLOSED状态(关闭状态)
常用的TCP端口号及其功能
UDP报文格式
源端口号(16) | 目标端口号(16) |
---|---|
UDP长度(16) | UDP校验和(16) |
UDP长度: 指UDP的总长度,首部加上数据
校验和 :用来完成对UDP数据的差错校验,它是UDP协议提供的唯一可靠机制
常用的UDP端口号及其功能
名称 | 端口号 | 功能 |
---|---|---|
TFTP(简单文件传输协议) | 69 | 用于小文件的传输 |
DNS(域名系统) | 53 | 用于解析DNS |
RPC(远程调用协议) | 111 | 用于远程过程调用 |
SNMP(简单网络管理协议) | 161 | 用于网络设备的管理 |
NTP(网络时间协议) | 123 | 用于网络时间同步 |