TCP/IP协议

网络基础

IP地址 唯一的标识

协议 共同语言

端口号 辨别应用程序0~65535 0 ~1023

TCP/IP协议

TCP/IP是应用最为广泛的协议。

是以TCP和IP为基础不同层次上协议的集合,也称为“TCP/IP协议族”

TCP 是传输控制协议
IP 是 互联网协议

TCP/IP模型 分为应用/传输/网络/数据连接/物理五层
Http80 FTP21 SMTP Telnet23

IP地址 唯一的标识

协议 共同语言

端口号 辨别应用程序
0~65535 0 ~1023

IP地址和端口号组成所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的终结点

Java中的网络支持
InetAddress 标识IP地址
URL
Sockets
Datagram UDP

三次握手

每发送一次代表一次握手。

客户端SYN_SEND状态)——发送TCP协议中的SYN包——>服务器

服务器(接收到包后进入SYN_RECV状态)——发送TCP协议中的SYN+ACK包——>客户端

客户端(接收到包后进入ESTABLISHED状态)——发送TCP协议中的SYN+ACK包——>服务器 (收包后服务器也进入ESTABLISHED状态)

为什么要三次握手?

第一次和第二次,为了确认服务器能正确的收到了客户端的信息并能回应客户端

第二次和第三次 ,为了确认客户端能正确的收到了服务器的回应信息并能再回应服务器

以此确保信息是双工的

四次挥手

客户端 (应用底层调用close()会发送一个TCP协议的FIN)——>服务器 请求关闭客户端服务器 的数据传输

服务器  收到请求后进行发送两条信息 ——TCP协议中的ACK——>客户端 确认关闭请求

服务器 (应用底层调用close()会发送一个TCP协议的FIN) ——TCP协议中的FIN——>客户端  请求关闭服务器客户端 的数据传输

客户端  ——TCP协议中的ACK——>服务器 确认关闭请求

上述中客户端和服务器的状态为:

WAIT状态 –>WAIT状态

WAIT状态 –>WAIT状态

LAST__ACK状态 –>WAIT状态

TIME WAIT状态在2MS后CLOSED状态 –>CLOSED状态

为什么要四次挥手?

因为服务器再LISTEN状态下的SOCKET收到SYN请求连接后后把ACK和SYN(ACK确认作用,SYN同步作用)放在一起发送,所以进行三次握手。而关闭连接时,FIN服务器一FIN报文收到底层就做出ACK回应,而服务器的是关闭请求是由应用底层调用close()激发的,所以FIN和ACK在发送时间上是分开的不能同时发送。

为什么 TIME_WAIT 状态还需要等 2MS L后才能返回到 CLOSED 状态?

这是因为虽然双方都同意关闭连接了,而且握手的 4 个报文也都协调和发送完毕,按理可以直接回到 CLOSED 状态(就好比从 SYN_SEND 状态到 ESTABLISH 状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的 ACK 报文会一定被对方收到,因此对方处于 LAST_ACK 状态下的 SOCKET 可能会因为超时未收到 ACK 报文,而重发 FIN 报文,所以这个TIME_WAIT 状态的作用就是用来重发可能丢失的 ACK 报文。