在开发面试时候,经常被问到三次握手、四次挥手是什么?老是一脸懵逼,突然看到记录下来。
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的连接(Socket中TCP的三次握手)
关于Socket中TCP的三次握手建立连接如下:
a、浏览器向服务器发送一个SYN J,
b、服务器对SYN J进行确认ACK J+1,向浏览器响应一个SYN K、ACK J + 1,
c、浏览器再向服务器发送一个确认ACK K + 1
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表现出来的。
四次握手
【问题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