作为程序员一定要保持良好的睡眠,才能好编程

三次握手和四次挥手详情解释

发布时间:2018-10-09

在开发面试时候,经常被问到三次握手、四次挥手是什么?老是一脸懵逼,突然看到记录下来。

1、在B/S架构中,Web浏览器与Web服务器之间的一次HTTP请求与响应:需要完成以下步骤:

http://localhost:8089/index.html

1)、浏览器端根据所在的HTTP协议解析出对应的url域名:localhost

2)、通过DNS域名解析,查询出该域名对应的IP地址:127.0.0.1

3)、通过URL解析出对应的端口号:8080

4)、浏览器发起并建立到127.0.0.1的连接(SocketTCP的三次握手)

关于SocketTCP的三次握手建立连接如下:

a、浏览器向服务器发送一个SYN J

b、服务器对SYN J进行确认ACK J+1,向浏览器响应一个SYN KACK J + 1

c、浏览器再向服务器发送一个确认ACK K + 1


三次握手.png



5)、浏览器向服务器发送GET请求

6)、服务器响应浏览器的请求

7)、浏览器读取响应,根据http协议渲染页面

8)、浏览器关闭与服务器的连接(TCP四次挥手)


解释含义:


在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.

其中,对于我们日常的分析有用的就是前面的五个字段。

 它们的含义是:

SYN表示建立连接,

FIN表示关闭连接,

ACK表示响应,

PSH表示有 DATA数据传输,

RST表示连接重置。

 其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,

 如果只是单个的一个SYN,它表示的只是建立连接。

TCP的几次握手就是通过这样的ACK表现出来的。



四次握手

四次挥手.png






【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。




使用javasocket实现了httpserver

https://blog.csdn.net/qq_25605779/article/details/70179461