一:引言
传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议是传输控制协议(TCP)和和用户数据报协议(UDP)
二:TCP
TCP概述
TCP是一种面向连接的传输层协议,提供可靠的传输服务。 TCP位于TCP?IP模型的传输层。它是一种面向连接的端到端协议。TCP作为传输控制协议可以为主机提供可靠的数据传输。TCP需要依赖网络协议为主机提供可用的传输协议。两台主机在通信前,需要TCP在它们之间建立可靠的传输通道。
TCP端口号
TCP允许一个主机同时运行多个应用进程。每台主机可以拥有多个应用端口,每对端口号、源和目标IP地址的组合唯一地标识了一个会话。
有些网络服务会使用固定的端口,这类端口称为知名端口,端口号范围是0-1023。其余的为动态端口。
TCP头部
源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个
序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从 0 开始
确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送发:我希望你(指发送方)下次发送的数据的第一个字节数据的编号是这个确认号
数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位), 4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节76
TCP包头
URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
ACK:表示是否前面的确认号字段是否有效。 ACK=1,表示有效。只有当ACK=1时,前面的确认号字段才有效。 TCP规定,连接建立后, ACK必须为1,带ACK标志的TCP报文段称为确认报文段
PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中
RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段
SYN:在建立连接时使用,用来同步序号。当SYN=1, ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1, ACK=1时,表示对方同意建立连接。 SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段
FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段
窗口大小:表示现在充许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量
校验和:提供额外的可靠性
紧急指针:标记紧急数据在数据字段中的位置
选项部分:其最大长度可根据TCP首部长度进行推算。 TCP首
部长度用4位表示,选项部分最长为: (2^4-1)*4-20=40字节
TCP建立连接(重点)
TCP是一种可靠的,面向连接的全双工传输层协议。
TCP连接的建立是一个三次握手的过程。如图所示
1客户端发送一个标识了SYN的数据段,表示期望与服务器A建立连接,次数据段的序列号为a。
2服务器回复标识了SYN+ACK的数据段,此数据段的序列号为b,确认序列号为a+1,以此作为对主机A的SYN豹纹的确认。
3主机A发送一个标识了SYN的数据段,此数据段的序列号为a+1,确认序列号为b+1,以此作为对服务器A的SYN报文段的确认。
TCP传输过程
TCP在传输过程中采用了确认技术,以确保目的设备收到了从原设备发来的数据,并且是准确无误的。 工作原理: 目的设备收到原设备发送的数据段时,会向源端发送确认报文,源设备收到确认报文后,继续发送报文,如此重复。
TCP流量控制
TCP滑动窗口技术通过动态改变窗口大小来实现端到端设备之间的数据传输进行流量控制。 当客户端向服务器发送数据时,发送了四个长度为1024字节的数据段,所以客户端的窗口大小为4096字节。结果服务器收到第三 个数据段之后缓存区满,第四个数据段被丢弃。服务器则将自己的窗口大小调整为3072字节(即3个数据段)表明服务器的缓存区只能处理3072个字节的数据段。于是客户端改变其窗口大小,发送窗口大小为3072的数据段。
TCP关闭连接
TCP支持全双工模式的传输数据,这意味着同一时刻两个方向都可以进行数据的传输。再传输数据之前,TCP通过三次握手建立的实际上是两个方向的链接,因此在传输完毕后,两个方向的连接都必须关闭。
上图中的状态:
CLOSED 没有任何连接状态
LISTEN 侦听状态,等待来自远方TCP端口的连接请求
SYN-SENT 在发送连接请求后,等待对方确认
SYN-RECEIVED 在收到和发送一个连接请求后,等待对方确认
ESTABLISHED 代表传输连接建立,双方进入数据传送状态
FIN-WAIT-1 主动关闭,主机已发送关闭连接请求,等待对方确认
FIN-WAIT-2 主动关闭,主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求
TIME-WAIT 完成双向传输连接关闭,等待所有分组消失
CLOSE-WAIT 被动关闭,收到对方发来的关闭连接请求,并已确认 LAST-ACK 被动关闭,等待最后一个关闭传输连接确认,并等待所有分组消失
CLOSING 双方同时尝试关闭传输连接,等待对方确认
关闭连接过程:
1当客户端执行主动关闭时,它将向服务器发送一个结束报文段,同时连接进入FIN_WAIT_1状态。若此时客户端收到服务器专门用于确认目的的确认报文段,则连接转移至FIN_WAIT_2状态。当客户端处于FIN_WAIT_2状态时,服务器处于CLOSE_WAIT状态,这一对状态是可能发生半关闭的状态。此时如果服务器也关闭连接(发送结束报文段),则客户端将给予确认并进入TIME_WAIT状态
2客户端从FIN_WAIT_1状态可能直接进入TIME_WAIT状态(不经过FIN_WAIT_2状态),前提是处于FIN_WAIT_1状态的服务器直接收到带确认信息的结束报文段(而不是先收到确认报文段,再收到结束报文段) 3处于FIN_WAIT_2状态的客户端需要等待服务器发送结束报文段,才能转移至TIME_WAIT状态,否则它将一直停留在这个状态。如果不是为了在半关闭状态下继续接收数据,连接长时间地停留在FIN_WAIT_2状态并无益处。连接停留在FIN_WAIT_2状态的情况可能发生在:客户端执行半关闭后,未等服务器关闭连接就强行退出了。此时客户端连接由内核来接管,可称之为孤儿连接(和孤儿进程类似)。
UDP
UDP概述
UDP是一种面向无连接的传输层协议,传输可靠性没有保障。当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时,可以用UDP协议来代替TCP协议
UDP头部
UDP传输过程
工作在传输层 提供不可靠的网络访问 非面向连接协议 有限的错误检查 传输性能高 无数据恢复特性 使用UDP传数据时,由应用程序根据需要提供保温到达确认,排序,流量控制等功能。