本篇主要介绍TCP协议以及UDP协议两种协议的内容以及特性,重点介绍了传输层协议的三次握手、四次挥手,同时介绍一些常见协议和相对应端口。
一、 TCP协议的特性
1.工作在传输层
2.面向连接协议
3.全双工协议
4.半关闭
5.错误检查
6.将数据打包成段,排序
7.确认机制
8.数据恢复,重传
9.流量控制,滑动窗口
二、UDP协议的特性
-
UDP特性
-
工作在传输层
-
提供不可靠的网络访问
-
非面向连接协议
-
有限的错误检查
-
传输性能高
-
无数据恢复特性
三、 PID与端口号
PID与端口号:系统每启动一个进程,系统都会分配一个标志给这个程序,也就是PID(系统中的编号)。其次会分配给进程分配一个端口号。PID在不同主机中的编号并不相同。
端口号作用:确定进程
端口号的分类:
1.规定好的,固定的端口号。(比如80端口号为http协议的端口号)
2.系统可以随机分配的端口号。(客户端在访问服务端时,系统会自动随机分配一个端口号)
3.人类可以自由使用的端口号。(新开发的程序规定的端口号且端口号之前没有被使用过)
四、 TCP协议的首部报文
源端口、目标端口:计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个,即 65536 (0-65535)。
序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0开始无限循环。
确认号:(ack)表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。举例:如果主机A需要给主机B发送数据包,主机A发送的确认号为0,那么主机A期望主机B回复数据包时需要发送一个数据包的序号为0+1的数据包。
数据偏移/首部长度:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
控制位的作用: 设备之间进行通讯,建立连接的状态由控制位决定。连接状态通常有三种:请求连接;建立连接;断开连接
URG(紧急位):表示本报文段中发送的数据是否包含紧急数据。当URG=1时后面的紧急指针字段(urgent pointer)才会生效
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,即告诉对方:“我的数据已经发送完毕,你可以释放连接了。”
校验和:提供额外的可靠性紧急指针:标记紧急数据在数据字段中的位置。
选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节
五、TCP的连接
5.1 TCP连接(三次握手)
首先,先给大家一张两台PC进行通讯的三次握手内容图进行分析:
如上图所示,PC1为客户端,PC2为服务端,PC1需要向PC2进行请求建立连接
第一步:PC1会发送一个请求建立连接的报文,这个报文包含以下几个内容:
- 报文的序号(Seq=x)
- 同步位由于PC1和PC2还没有建立连接,处于请求建立连接的状态,所以同步位SYN=1,确认位ACK=0.
第二步:PC2收到PC1请求建立连接的报文后,同意与PC1建立连接,所以需要回复一个报文给PC1,PC2发送的报文内容有以下几点:
- 报文的序号(Seq=y)
- Ack确认号为x+1,即PC2需要PC1回复一个报文序号为x+1的报文
- 控制位 SYN=1 ACK=1 PC2同意PC1请求建立连接的请求,即确认位为1,同步位为1
第三步:PC1收到PC2的回复报文后
- 会发送一个报文序号为x+1的报文,即Seq=x+1
- Ack确认号为y+1,即希望PC2下一次回复消息的报文序号为y+1
- 最后将ACK=1封装进数据包中,这时候PC1与PC2已经建立连接同步位SYN=0
5.2 TCP断开(四次挥手)
下图为TCP断开连接的图片解析
客户A和服务器B都处于建立连接的状态,此时客户A主动与服务器B发出断开连接的请求: 第一步:客户A会发送一个序号为Seq=u的报文给服务器B,此时控制位中的断开位FIN=1,即请求与服务器B断开连接。(PS:此时客户A处于等待断开连接的状态,服务器B的数据传送未结束)
第二步:服务器B需要先将数据传输全部传输结束才能同意断开连接,服务器B会进行下面两步操作:
2.2 服务器B会回复一个报文序号为v的报文给客户A(Seq=1)
需要客户A能回复一个报文序号为u+1的报文给服务器B(确认号ack-u+1)
此时服务器B与客户A仍处于建立连接的状态所以控制位的确认位ACK=1
2.3 服务器B同意了客户A的断开连接请求:服务器B会回复一个同意断开连接的报文:
服务器B发出的报文的序号为w(Seq=w)
需要客户A回复一个报文序号为u+1的报文给服务器B(Ack=u+1)
此时的控制位中,断开位FIN=1,确认位ACK=1(2个控制位表示同意断开连接)
第三步:客户A接收完服务器传输的数据后,收到了服务器B的同意断开连接请求,这个时候客户A会发送一个确认报文给服务器B:
按照服务器B要求,客户A回复了一个报文序号为u+1的报文给服务器B(Seq=u+1)
控制位中确认位为1(ACK=1)
需要服务器B回复客户A一个报文序号为w+1的报文给客户A(此时客户A与服务器相当于完全断开连接,所以客户A最后发送的报文将会被服务器B拒收,服务器B将不再回复客户A)
总结
本章的重点主要是理解,TCP与UDP协议的特性和优缺点对比,重点理解传输层中TCP的三次握手中控制位处于什么状态以及变化。