网络基础
网络的七层协议:应用层,表示层,会话层,运输层,网络层,数据链层,物理层。表示层、会话层没有相应的协议,表示层常用来做数据格式化/加密等操作

协议:本质便是套着特殊格式的数据,最终数据到达的时候,需要将一层层包裹的协议拆开,然后才能拿到里面的数据(最终拿到的数据是去掉应用层协议的数据)
常见的网络层次划分还有TCP/IP四层协议以及TCP/IP五层协议


用户在浏览器输入URL敲回车时到底发生了啥?
URL->DNS解析出服务器IP地址->发送http请求->TCP连接(三次握手)->连接成功后,client向服务器发送http协议包->server向client发送Http协议应答包->client和server断开连接(四次挥手)
TCP三次握手:client向server发送SYN(同步序列编号)包,进入SYN_SENT状态,服务器接收到SYN后将其加1返回ack(确认编号)包,同时发送自己的SYN包,并进入SYN_RECV状态。client接收到SYN+1返回ack包,再发送server。client和server进入ESTABLISHED状态。

为什么要三次握手?
因为TCP是基于可靠连接之上的。也就是说双方都要知道自己的收发数据通道都没问题
1 client发送syn给server: server接收到syn后,server知道自己接收client的通道没问题,此时client在傻傻的等着,它并不知道它发送成功了没有。并且如果在规定的时间它没有收到回复,还会重新发送syn(超时重发)。
2 server回复syn 和ack 给client: 因为这个ack是前面client发的syn+1,所以client知道client前面的syn发送成功了,也就是自己的发送通道没问题,并且client可以接收server的消息。也就是自己的接收通道也没问题。但是这个时候server不知道自己的发送通道是否没问题。因此需要client回复
3 client发送ack给server: 因为这个ack是前面server发的syn+1,所以server知道server前面发的消息没问题,也就是发送通道没问题。这个时候两边都知道自己的收发通道没问题,所以进入ESTABLISHED状态开始发送数据
TCP断开连接(四次挥手):
1 client发送FIN(结束标志)包,client进入FIN_WAIT_1状态,
2 server接到后向client发送ack包,这个时候client进入等待状态FIN_WAIT_2状态,
3 当server确定没有数据发送了,则再向client发送 FIN(结束标志)包,server进入CLOSE_WAIT状态。
4 client接收到FIN后,向server发送ack,client进入TIME_WAIT状态,2MSL后进入关闭 CLOSED状态,server接收到后关闭进入CLOSED状态。

为什么断开要四次?
两边都要发送断开请求。并且两边都要知道发送成功了
1 [client发送FIN给server] client告诉server:我数据传输完成了,请求断开
2 [server接收到FNI后] server回复client ack:我接收到你的断开请求了,你等等先,我要确定你发的数据我都接收完成了
3 [server发送FNI给server] server告诉client: 好了。我数据都接收完成了。我也要断开了,你也可以断开了。
4 [client回复ack给server]client告诉server:你发的断开我收到了。server收到ack后知道自己的FNI发送成功,关闭连接,client等了2MSL没有回复,知道server已经关闭连接,自己也关闭连接
什么是2MSL?MSL即Maximum Segment Lifetime,也就是报文最大生存时间,引用《TCP/IP详解》中的话:“它(MSL)是任何报文段被丢弃前在网络内的最长时间。”那么,2MSL也就是这个时间的2倍。至于为什么会是这么多时间。有兴趣自行研究
网友评论