一、传输层TCP、UDP
1.TCP/IP协议栈介绍
TCP/IP是一个Protocol Stack,包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议 。最早发源于1969年美国国防部(缩写为DoD)的因特网的前身ARPA网络项目,1983年1月1日,TCP/IP取代了旧的网络控制协议NCP,成为今天的互联网和局域网的基石和标准,由互联网工程任务组负责维护国防高级研究计划局DARPA与BBN技术公司、斯坦福大学和伦敦大学学院签约,在多个硬件平台上开发协议的操作版本。 在协议开发过程中,数据包路由层的版本号从版本 1 进展到版本 4,后者于 1983 年安装在 ARPANET 中。它被称为互联网协议版本4(IPv4)作为协议,仍在互联网使用,连同其目前的继承,互联网协议版本6(IPv6)。
2.TCP/IP分层模型
共定义了四层,和 OSI七层参考模型的分层有对应关系,相对于来说就是OSI的精简版。
RFC官方分为四层:
- Application Layer---------应用层
- Transport Layer-----------输入层
- Internet Layer------------网络层
- Link Layer(media-access)--网络接口层
3.TCP/IP通讯过程
二、TCP协议和UDP协议
TCP/IP协议簇的传输层协议主要有两个:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报协议)。
1.无连接网络协议和面向连接网络协议
TCP 是一种面向连接的协议,在传输数据之前先测试联通性,如果通才会传输真实数据先测试后传输。在使用 TCP 时,数据会被分割成多个数据包,并通过网络进行传输,接收端会对接收到的数据包进行排序和重组,以确保数据的完整性和顺序性。TCP 还使用了确认应答机制来确保数据的可靠性,因此适用于对数据完整性要求较高的场景,如文件传输、电子邮件等。
UDP 则是一种无连接的协议,它不保证数据的可靠性和顺序性,也没有建立连接和断开连接的过程。UDP 直接将数据打包成数据包,然后发送到网络上,接收端收到数据包后即可直接处理,不需要等待确认或按顺序重组数据。UDP 适合于实时性要求较高的场景,比如音视频流传输、在线游戏等。
UDP特性
- 工作在传输层
- 提供不可靠的网络访问
- 非面向连接协议
- 有限的错误检查
- 传输性能高
- 无数据恢复特性
TCP特性
- 工作在传输层
- 面向连接协议
- 全双工协议
- 半关闭
- 错误检查
- 将数据打包成段,排序
- 确认机制
- 数据恢复,重传
- 流量控制,滑动窗口
三、TCP协议
1.TCP数据段
TCP数据段是由TCP头部和上层数据组成,TCP头部包含了一些控制信息,用于管理连接的建立、维护和关闭等操作。常见的TCP头部字段包括源端口号、目标端口号、序列号、确认号、窗口大小等。
-
目标端口: 计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个,即 65536 (0-65535)
-
序列号: 表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0 开始 无限循环
-
确认号:(ack)表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号:传输是否有问题?
-
数据偏移/首部长度:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
-
控制位
URG(紧急位) :表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效
ACK(确认位): 表示是否前面确认号字段是否有效。只有当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报文段称为结束报文段
-
窗口大小: 表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由Window size value * Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值
-
校验和: 提供额外的可靠性紧急指针:标记紧急数据在数据字段中的位置
-
选项部分: 其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节
四、TCP的三次握手
1.为什么要三次握手
TCP三次握手是建立TCP连接时使用的一种流程,用于确保通信双方的发送和接收能力正常。该过程由三个步骤组成
第一次握手:客户端向服务器发送一个带有SYN(同步序列编号)标志的数据包,表示客户端请求建立连接,并选择一个初始的序列号。
第二次握手:服务器接收到客户端发来的SYN数据包后,会返回一个带有SYN/ACK标志的数据包给客户端,表示确认客户端的请求,并自己也请求建立连接,同时确认客户端的初始序列号。
第三次握手:客户端收到服务器发来的SYN/ACK标志的数据包后,会向服务器发送一个带有ACK标志的数据包,表示确认服务器的请求。服务器收到这个ACK数据包后,确认连接建立完成。
经过三次握手,客户端和服务器就建立了可靠的连接,可以开始进行数据的传输和通信。这个过程可以确保双方的通信能力正常,同时也可以防止已失效的连接请求导致的问题。
2.TCP的四次挥手(连接中止)
TCP四次挥手是指在TCP连接中,当通信双方需要关闭连接时的一系列步骤。
第一次挥手:当一方决定关闭连接时,发送一个FIN(Finish)标志给对方,表示自己已经发送完数据,准备关闭发送端。此时进入FIN_WAIT_1状态。
第二次挥手:另一方收到FIN后,会发送一个ACK(确认)给对方,表示已经收到关闭请求。同时,它自己也会发送一个FIN给对方,表示自己也准备关闭发送端。此时进入CLOSE_WAIT状态。
第三次挥手:收到另一方的FIN后,回复一个ACK给对方,表示收到关闭请求。此时进入LAST_ACK状态。
第四次挥手:最后,另一方收到ACK后,进入CLOSED状态,表示连接已经关闭。
通过这四个步骤,双方完成了连接的关闭,释放了资源,确保连接的安全关闭。