TCP与UDP
TCP/IP分层模型
应用层 | HTTP、SMTP、FTP、SSH、DNS、HTML | 向用户提供应用服务时的通信活动 |
传输层 | TCP、UDP | 在该层确定数据包应该转发给哪一个应用,也就是将数据包发送到对应的端口号上。 |
网络层 | IP、ARP、ICMP | 在该层确定数据包应该转发给网络上的哪一个主机,也就是将数据包发送到IP地址所对应的主机上。 |
数据链路层 |
TCP介绍
TCP是一种面向连接的、可靠的传输层协议。
面向连接是指,当两个应用程序使用TCP协议进行数据传输时,需要通过“三次握手”建立一条双方专有的、虚拟的通信线路,
在这条线路上进行数据传输,当双方要停止数据交互时,需用用“四次挥手”的方式来断开连接。
可靠是指TCP协议中包含了数据传输时的丢包控制,以及对乱序的数据包进行顺序控制等功能。
TCP三次握手
在介绍TCP三次握手之前,先来看看TCP首部的格式。如下图:
源端口号:记录了发送该数据包的端口
目标端口号:记录了该数据包的目的端口
序列号:每发送一次数据,就对该部分进行一次累加,序列号的初值是在建立连接时由计算机随机生成的。
确认应答号:表示下一次应该收到的数据的序列号。
接下来主要看一下TCP首部中的控制位部分,如下图所示:
只需要知道ACK、SYN、FIN等控制位的作用,就大致能弄明白三次握手和四次挥手了。
ACK:如果该位为1,确认应答的字段变为有效。
SYN:用于建立连接。SYN为1表示希望能够建立连接。
FIN:该位为1,表示之后不会再有数据进行交互,希望断开连接。
TCP的三次握手流程如下图所示(图片来源)
图中SYN以及大写的ACK是控制位,seq就是TCP首部中的序列号,小写的ack是TCP首部中的确认应答号。
- 首先客户端会向服务器发送一个请求,这个请求数据包中,SYN控制位被置为1,表示客户端现在希望与服务器建立TCP连接,此时客户端会随机生成一个x作为seq发送给服务端。
- 当服务器监听到客户端发来的建立连接的请求后,服务端会向客户端发送一个数据包,其中SYN=1,表示服务端也想建立链接,ACK=1表示这是对刚刚客户端发来请求的一个应答,此时服务器也会随机生成一个y作为自己的序列号发送给客户端,并将ack=x+1,表示我(服务器)想接收到的客户端下一个请求的序列号是x+1。
- 最后,客户端会再给服