fangmd / blogsource

6 stars 0 forks source link

UDP TCP/IP #32

Open fangmd opened 3 years ago

fangmd commented 3 years ago

7层模型:

应用层
表示层
会话层
传输层:TCP UDP
网络层:   IP
数据链路层
物理层

参考:

fangmd commented 3 years ago

网络层: IP协议

给数据包添加 IP相关数据(协议头)

  1. 不可靠协议
fangmd commented 3 years ago

数据链路层

给数据包添加:以太网相关数据

fangmd commented 3 years ago

传输层 TCP/UDP

image

  1. TCP 三次握手

客户端发送SYN请求,进入 SYN_SEND 状态

服务器收到请求,给客户端发送 ACK,服务器进入 SYN_RECV 状态

客户端收到 ACK, 客户端发送ACK, 客户端和服务器都进入 ESTABLISHED 状态。

作用:处理失效连接,防止资源浪费。

TCP 需要 seq 序列号来做可靠重传或接收,而避免连接复用时无法分辨出 seq 是延迟或者是旧链接的 seq,因此需要三次握手来约定确定双方的 ISN(初始 seq 序列号)。

三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。

为什么不是4次? 4次也可以,不过2,3可以合并所以就只有3次了,可以提高效率(2组 SYN+ACK)

  1. TCP 四次挥手

客户端发送 FIN, 进入 FIN_WAIT_1 状态

服务器收到FIN, 回复 ACK, 客户端进入 FIN_WAIT_2 状态,

服务器发送 FIN, 进入 LAST_ACK 状态

客户端收到FIN, 回复 ACK, 进入 TIME_WAIT 状态,服务器收到FIN后关闭连接,客户端等待2MSL后关闭

为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态? 为了保证B能收到A的确认应答。 若A发完确认应答后直接进入CLOSED状态,那么如果该应答丢失,B等待超时后就会重新发送连接释放请求,但此时A已经关闭了,不会作出任何响应,因此B永远无法正常关闭。

为什么要4次? (1)第一次挥手 因此当主动方发送断开连接的请求(即FIN报文)给被动方时,仅仅代表主动方不会再发送数据报文了,但主动方仍可以接收数据报文。
(2)第二次挥手 被动方此时有可能还有相应的数据报文需要发送,因此需要先发送ACK报文,告知主动方“我知道你想断开连接的请求了”。这样主动方便不会因为没有收到应答而继续发送断开连接的请求(即FIN报文)。
(3)第三次挥手 被动方在处理完数据报文后,便发送给主动方FIN报文;这样可以保证数据通信正常可靠地完成。发送完FIN报文后,被动方进入LAST_ACK阶段(超时等待)。
(4)第四挥手 如果主动方及时发送ACK报文进行连接中断的确认,这时被动方就直接释放连接,进入可用状态。

fangmd commented 3 years ago

应用层

image