一、传输层知识回顾
1、传输层的功能
- 定义应用层协议数据报文的端口号,流量控制
- 对原始数据进行分段处理
2、传输层提供的服务
- 传输连接服务
- 数据传输服务、流量控制、差错控制、序列控制
3、传输层的协议
- 面向连接的传输协议TCP
要求数据在传输之前必须建立连接,数据传输完成后,必须释放连接
仅支持单播传输,在两个终端之间建立点对点连接 - UDP(用户数据报协议)
二、TCP协议
1、TCP协议
- 面向连接的传输协议
- 要求数据在传输之前必须建立连接,数据传输完成后,必须释放连接
- 仅支持单播传输,在两个终端之间建立点对点连接
2、TCP报文结构
- Source port:发送方端口号,随机端口
- Destination:目标端口,HTTP协议,默认端口80
- Sequence Number序列号
- Acknowledgement number确认号
- Header length:首部长度,32位
- Reserved:为TCP将来发展预留的空间
- Flags:控制位,常见的有urg、Ack、Push、Reset、Syn、Fin
- urgent:用于标识发送数据时是否为紧急
- Ack:确认控制位,服务器回复的确认
- Push:是否将数据推到上一层
- Reset:是否重置连接
- Syn:建立连接时的控制位
- Windows size value:窗口大小
- Checksum 校验和
- Urgent pointer:紧急指针
- Options 选项
这里控制位为1表示现在正在发请求
Fin:数据发送完毕会有释放连接,当释放连接时Fin控制位为1
3、TCP报文字段
- 序号seq:占32位,用于标识报文段所发送数据的第一个字节的编号。在TCP连接中,所传送的字节流的么一个字节都会按顺序编号。当SYN标记不为1时,这是当前数据分段的第一个字母的序列号;如果SYN的值为1时,这个字段的值就是初始序列值(ISN),用于对序列号进行同步。这时,第一个字节的序列号比这个字段的值大1,也就是ISN加1.
- TCP确认号Acknowledgement numbe:占32位,它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号,其值是接收计算机即将接收到的下一个序列号,也就是下一个接收到的字节的序列号加1.
- TCP首部长度:数据偏移是指数据段中“数据”部分起始距离TCP数据段起始处的字节偏移量,占4位,其实这里的“数据偏移”也是在确定TCP数据段头部分的长度,告诉接收端的应用程序,数据从何处开始。
- 保留Reserved:占4位,为将来TCP的发展预留的空间。目前必须全部为0.
- URG:表示报文段中发送的数据是否包含紧急数据。URG为1表示有紧急数据,当URG为1时,后面的紧急指针字段才有效。
- ACK:表示前面的确认字段是否有效。当ACK为1表示有效。只有当ACK为1时,前面确认号字段才有效。TCP规定,连接建立后,ACK必须为1.
- PSH:告诉对方 收到该报文段是否立即把数据推送给上层。如果值为1,表示应当立即把数据交给上层,而不是缓存起来。
- RST:表示是否重置连接。如果RST为1,说明TCP连接出现了严重错误(如主机奔溃),必须释放连接,然后再重新建立连接。
- SYN:在建立连接的时候使用,用来同步序列号。当SYN为1,ACK为0时,表示这是一个请求建立连接的报文段;当当SYN为1,ACK为1时,表示对方同意建立连接。当SYN为1时,说明这是一个请求建立连接或同意建立连接的报文,只有再前两次我手中SYN才为1.
- FIN:标记字段数据是否发送完毕。如果FIN为1,表示数据已经发送完成,可以释放连接。
4、TCP连接与释放
(1)三次握手
服务器上搭建有网站,开启了HTTP服务
TCP三次握手
- 客户机向服务器发送请求建立连接,SYN控制位为1,报文有序列号seq假设为x。
- 服务器收到客户端发来的建立连接请求后向客户端发出确认请求报文,ACK控制位为1,ack序列号为x+1,(ack=seq+1表示对上一条请求建立连接报文的确认),SYN控制位为1,报文有序列号seq记为y。
- 客户端收到服务器发来的确认连接请求后,client向server回应确认请求报文,ACK控制位为1,ack序列号为y+1。seq 序列号为x+1.
Q:为什么是三次握手?不是两次或者四次呢?
-
两次握手,会发生什么情况呢? 服务端在发出应答消息后无法确认客户端是否接受到消息了。
-
四次握手,在三次握手中已经建立了一个稳定的传输流,为什么还要浪费性能再去发一次消息,第四次握手是一种性能浪费。
(2)四次挥手
TCP四次挥手
- 客户端发送一个FIN+ACK标记的包,告诉服务器需要关闭连接,表示自己不用发送数据了,但是还可以接收数据。发送完成后,
客户端
进入FIN_WAIT_1
状态。 - 服务端发送一个ACK的确认包,告诉客户端接收到关闭的请求,但是还没有准备好。发送完成后,
服务端
进入CLOSE_WAIT
状态,客户端
收到这个包后,进入FIN_WAIT_2
,等待服务器关闭连接。 - 服务端准备好关闭连接时,发送FIN+ACK标记的包,告诉客户端准备关闭了。发送完成后,
服务端
进入LAST_ACK状态,等待客户端确认 - 客户端接收到服务端的关闭请求,再发送ACK标记的确认包,进入
TIME_WAIT
状态,等待服务端可能请求重传的ACK包。服务端接收到ACK包后,关闭连接,进入CLOSED状态。客户端在等待固定时间(两个最大段生命周期)后,没有接收到服务的ACK包,认为服务器已关闭连接,自己也关闭连接,进入CLOSED状态。
Q:为什么是三次握手,却是四次挥手?三次挥手不可以吗?
假设是三次挥手,在服务器接收到客户端发送关闭的请求后,把SYN和ACK包一起发过去。这样会造成服务端还有数据没有发送完,造成了数据的丢失。所以中间的这一段时间,等待服务器把剩余的数据发送完是很有必要的。
(3)TCP半关闭
- 客户机向服务器发送FIN表示客户机想要断开连接,但是服务器还在给客户机发送数据。
- 客户机向服务器发送重新建立连接请求,客户机表示可以重新建立与服务器的连接。
- 服务器向客户机发送了FIN+ACK断开连接的请求。
- 客户机又向服务器发送重新建立连接的请求。
(4)TCP半连接
半连接是SYN Flood的原理所在,SYN Flood是DDOS的一种。
- 三次握手过程中客户机向服务器发了SYN请求
- 服务器正常响应。标识与客户机建立连接,客户机已经占用了服务器资源。
- 客户机不进行第三次握手,称为半连接,会造成一直占用服务器的连接资源。
5、常见的TCP端口号
- 21 FTP
- 22 SSH
- 23 Telnet
- 25 Smtp
- 53 DNS
- 80 HTTP
- 110 POP3
- 143 IMAP4
- 443 HTTPS
- 3306 MYSQL
- 3389 RDP
dns是基于UDP的,但是如果有两台DNS服务器,要把一台DNS服务器上的数据同步到另一台DNS服务器上(即主DNS和辅助DNS的数据要实时同步),需要可靠连接的,所以会建立TCP连接。