前端网络基础(2)
TCP
TCP:传输控制协议(Transmission Control Protocol)
特点:面向连接(收/发数据前,必须要建立可靠的连接),而建立连接的基础就是三次握手
。
应用场景:在数据必须准确无误地收发的场景(如:HTTP请求、FTP文件传输、邮件收发…)
TCP/IP
TCP/IP协议组:提供点对点的连接机制,制定了数据封装、定址、传输、路由、数据接收的标准。
UDP
UDP:用户数据报协议(User Data Protocol)
特点:面向无连接(不可靠的协议,无状态的传输机制),无连接信息发送机制。
应用场景:无需确定通讯质量且要求速度快、无需确保信息完整(如:消息收发、语音通话、直播…)
优点:安全、快速、漏洞少(也能被攻击:UPD flood攻击)
缺点:不可靠、不稳定、容易丢包
只要双方的地址和端口号确定,就可以直接发送信息报文,但不保证一定收到或收到完整的数据。
TCP/IP三次握手
名词解释
标志位:数据包
- SYN:Synchronize Sequence Number(同步序列编号)
- ACK:Acknowledgement(确认字符)
状态:
- LISTEN:监听TCP端口的连接请求(等待请求状态)
- SYN-SENT:发送连接请求后等待匹配的连接请求(SYN已发送状态)
- SYN-RECEIVED:在收到和发送一个连接请求后等待对方确认连接请求(等待确认状态)
- ESTABLISHED:代表一个打开的连接,数据可以传输给用户(连接已完成状态)
过程
- 服务器处于侦听连接请求状态(LISTEN);
- 客户端发送
SYN J
包给服务器,客户端进入SYN-SENT
状态; - 服务器发送
SYN K
包和确认包ACK J + 1
给客户端,服务器进入SYN-RECEIVED
状态; - 客户端发送确认包
ACK K + 1
给服务器,此时客户端进入ESTABLISHED
状态 ; - 服务器接收到客户端发送过来的确认包,进入
ESTABLISHED
状态。
图解
TCP/IP四次挥手
名词解释
- FIN:finish(关闭连接)
状态:
- FIN-WAIT-1:等待远程TCP连接中断请求
- FIN-WAIT-2:等待远程TCP的连接中断请求
- CLOSE-WAIT:等待从客户端发来的连接中断请求
- LAST-ACK:等待原来发向远程TCP的连接中断请求的确认
- TIME-WAIT:等待足够时间以确保远程TCP接收到连接中断请求的确认
- CLOSED:连接已关闭
过程
- 客户端发送连接关闭报文(此时已经停止发送数据)(第一次挥手)
- 报文首部:
FIN = 1
、序列号seq = u
- 此时,客户端进入中断等待1状态(
FIN-WAIT-1
)
- 报文首部:
- 服务器收到连接关闭报文,并发送确认报文(表示已经接收到了中断的请求)(第二次挥手)
- 报文首部:
ACK = 1
、序列号seq = v
、ack = u + 1
(确认FIN
包) - 此时,服务器进入关闭等待状态(
CLOSE-WAIT
) - 说明:连接半关闭状态,客户端无法再请求数据,但服务器如果还有数据要发送,客户端依然需要接收
- 报文首部:
- 客户端收到服务器的确认请求,客户端进入中断等待2状态(
FIN-WAIT-2
)- 服务器在这期间需要确认客户端所需的数据是否已经发送完毕,如没有则继续发送
- 服务器确认数据已经发送完毕后,向客户端发送连接关闭报文(第三次挥手)
- 报文首部:
FIN = 1
、ACK = 1
、序列号seq = w
、ack = u + 1
(确认上一次数据包) - 此时,服务器进入最后确认状态(
LAST-ACK
)
- 报文首部:
- 客户端收到服务器的连接关闭报文后,发出确认报文(第四次挥手)
- 报文首部:
ACK = 1
、序列号seq = u + 1
、ack = w + 1
(确认上一次数据包) - 此时,客户端进入时间等待状态(
TIME-WAIT
),等待2MSL
- 报文首部:
- 服务器接收到客户端发出的确认,立即进入TCP关闭状态(
CLOSED
),TCP连接结束- TCP关闭,服务器要比客户端早一些
TIME-WAIT时长:2MSL(MSL:Maximum Segment Lifetime,最大报文生存时间)
MSL
的值根据不同的情况而不同,一般是30秒、1分钟、2分钟。
等待2MSL的目的:保证客户端发送的最后一次确认报文能够发送到服务器,一旦报文丢失,服务器会认为是最后一次发送的FIN + ACK
包(第三次挥手)没有被客户端接收到。此时,服务器会重新发送一次(再进行一次第三次挥手),而客户端可以在2MSL
的TIME-WAIT
时间内收到后重新进行第四次挥手,并重启2MSL
计时器。
图解
为什么是四次挥手
第一次挥手的时候,发送了FIN包
,服务器接收到以后,表示客户端不会再发送数据了,但还能接收数据。这时服务器先向客户端发送确认包,并且确认自己是否还有数据没有发送给客户端,这个确认阶段是CLOSE-WAIT
,所以在中断等待2(FIN-WAIT-2
)和CLOSE-WAIT
的开始和结束需要各发送一个包,状态开始时向客户端发送的包是确认收到来自客户端的FIN包
,状态结束时向客户端发送的是确认数据已经完整发送,所以是四次挥手。