UDP_0">UDP(用户数据报协议)
UDP_1">UDP特点
UDP只在IP数据报服务的基础上增加了少量的功能:复用与分用、对整个报文的差错检测。
-
UDP是无连接的
通信前不需要建立连接,通信结束也无需释放连接。 -
UDP是不可靠的
它是尽力而为交付,不能确保每一个数据报都送达。 -
UDP是面向报文的
所谓『面向报文』就是指:UDP数据传输的单位是报文,且不会对数据作任何 拆分 和 拼接 操作。
在发送端,应用程序给传输层的UDP什么样的数据,UDP不会对数据进行切分,只增加一个UDP头并交给网络层。
在接收端,UDP收到网络层的数据报后,去除IP数据报头部后遍交给应用层,不会作任何拼接操作。 -
UDP没有拥塞控制
UDP始终以恒定的速率发送数据,并不会根据网络拥塞情况对发送速率作调整。这种方式有利有弊。
弊端:网络拥塞时有些报文可能会丢失,因此UDP不可靠。
优点:有些使用场景允许报文丢失,如:直播、语音通话,但对实时性要求很高,此时UDP还是很有用武之地的。
UDP_26">UDP报文头
- 源端口
- 目的端口
- 长度:整个数据报的长度
- 检验和:整个数据报的检验和。
TCP_33">TCP(传输控制协议)
TCP_34">TCP特点
-
TCP是面向连接的
通信前需要建立连接,通信结束需要释放连接。 -
TCP是面向字节流的
所谓『面向字节流』指的是:TCP以字节为单位。虽然传输的过程中数据被划分成一个个数据报,但这只是为了方便传输,接收端最终接受到的数据将与发送端的数据一模一样。
TCP___49">TCP连接 与 套接字
什么是『TCP连接』?
TCP连接是一种抽象的概念,表示一条可以通信的链路。每条TCP连接有且仅有两个端点,表示通信的双方。且双发在任意时刻都可以作为发送者和接收者。
什么是『套接字』?
一条TCP连接的两端就是两个套接字。套接字=IP地址: 端口号。因此,TCP连接=(套接字1,套接字2)=(IP1:端口号1,IP2:端口号2)
TCP_57">TCP头部
TCP头部长度有20字节的固定部分,选项部分长度不定,但最多40字节,因此TCP头部在20-60字节之间。
-
源端口 和 目的端口
传输层和网络层一大重要区别就是传输层指定了数据报发往的应用进程,因此需要端口号标识。 -
序号
当前TCP数据报数据部分的第一个字节的序号。我们知道,TCP是面向字节的,它会对发送的每一个字节进行编号,而且不同数据报之间是连续编号的。
由于本字段4字节,可以给[0,232-1]个字节进行编号(大约4G),而且序号循环使用,当发送完232-1个字节后,序号又从0开始。一般来说,当2^32-1个字节被发送的时候,前面的字节早就发送成功了,因此序号可以循环使用。 -
确认号
表示当前主机作为接收端时,期望接收的下一个字节的编号是多少。也表示,当前主机已经正确接收的最后一个字节序号+1。 -
数据偏移(报文长度)
它表明了数据报头部的长度。 -
保留字段
-
URG=1 当URG字段被置1,表示本数据报的数据部分包含紧急信息,此时紧急指针有效。紧急数据一定位于当前数据包数据部分的最前面,紧急指针标明了紧急数据的尾部。如control+c:这个命令要求操作系统立即停止当前进程。此时,这条命令就会存放在数据包数据部分的开头,并由紧急指针标识命令的位置,并URG字段被置1。
-
ACK=1 ACK被置1后确认号字段才有效。此外,TCP规定,在连接建立后传送的所有报文段都必须把ACK置1。
-
PSH=1 当接收方收到PSH=1的报文后,会立即将数据交付给应用程序,而不会等到缓冲区满后再提交。一些交互式应用需要这样的功能,降低命令的响应时间。
-
RST=1 当该值为1时,表示当前TCP连接出现严重问题,必须要释放重连。
-
SYN=1 SYN在建立连接时使用。当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文。当SYN=1,ACK=1时,表示当前报文段是一个同意建立连接的应答报文。
-
FIN=1 FIN=1表示此报文段是一个释放连接的请求报文。