<>五、传输层。

网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。
UDP 和 TCP 的特点:

* 用户数据报协议 UDP(User Datagram Protocol)
:无连接;尽最大努力的交付;面向报文;无拥塞控制;支持一对一、一对多、多对一、多对多的交互通信;首部开销小(只有四个字段:源端口、目的端口、长度、检验和)。
* 传输控制协议 TCP(Transmission Control Protocol)
:面向连接;每一个TCP连接只能是点对点的(一对一);提供可靠交付服务;提供全双工通信;面向字节流。
UDP的首部格式:

首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12
字节的伪首部是为了计算检验和临时添加的。IP数据报的检验和只检验IP数据报的首部,但是UDP的检验和是把首部和数据部分一起都检验。
TCP报文段的首部格式:

源端口:各占两个字节;分别写入源端口号和目的端口号。
序号 :占4个字节;用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为
401。
确认号 :占4个字节;期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B
期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
数据偏移 :占4位;指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。
确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。
终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。
窗口 :占2字节;窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
检验和:占2个字节;检验和字段检验的范围包括首部和数据这两个部分。在计算检验和时,在TCP报文段的前面加上12字节的伪首部。
套接字:TCP连接的端点叫做套接字或插口。端口号拼接到IP地址即构成了套接字。
* 套接字的表示方法:
在点分十进制的IP地址后面写上端口号,中间用冒号隔开。
每一个TCP连接唯一的被通信两端的两个端点(两个套接字)所确定。
TCP连接::={socket1,socket2}={(IP1:port1),(IP2,poet2)}
注意:同一个IP地址可以有多个不同的TCP连接;而同一个端口号也可以出现在多个不同的TCP连接中。
端口号:
*
运输层的端口号分为服务器端使用的端口号(0——1023指派给熟知端口,1024——49151是登记端口号)和客户端暂时使用的端口号(49152——65535)
TCP的三次握手过程:

假设 A 为客户端,B 为服务器端。
* 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
* A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
* B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
* A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。
* B 收到 A 的确认后,连接建立。
三次握手的原因:

第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。
TCP的四次挥手过程:

注:以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。
* A 发送连接释放报文,FIN=1。
* B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
* 当 B 不再需要连接时,发送连接释放报文,FIN=1。
* A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
* B 收到 A 的确认后释放连接。
四次挥手的原因:
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT
状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
时间等待计时器:(TIME_WAIT)
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这有两个理由:
* 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
* 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信