OSI七层网络模型自下向上分别是:物理层、数据链路层、网络层、传输层、表示层、会话层、应用层。
物理层:物理层的作用就是传输比特流以及数模转换和模数转换(将0101的二进制数据转换为电流的强弱进行传输,等到达目的地后0101的机器码,网卡就是工作在这一层);物理层主要是来定义物理设备的标准,如网线的类型,光纤的接口类型,各种传输介质的传输速率等(网卡属于物理层)
数据链路层:数据链路层的作用是:将比特数据组装成帧,然后交换机对帧进行解码,并根据帧中包含的信息,将数据准确的发送给接收方;数据链路层定义了如何格式化数据进行传输,如何控制对物理介质的访问,以及提供错误检测和纠正保证数据传输的可靠性。(交换机属于数据链路层)
网络层:网络层的主要作用是将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由路由接收方,根据发送优先权,网络拥塞程度,服务质量以及可选路由的花费来决定,从网络中节点A到另一个网络中节点B的最佳路径。,此层的数据称为数据包(路由器属于网络层),此层我们需要关注的协议是IP协议。
传输层:主要作用为上层协议提供端到端的数据传输服务,包括处理差错控制和流量控制等问题,此层所用到协议主要是TCP,UDP协议。
会话层:主要作用就是建立和管理应用程序之间的通信;
表示层:主要是解决不同通信机器之间的语法问题
应用层:为用户的应用程序(例如电子邮件,终端传输)提供网络服务,此层主要用到HTTP协议;
TCP/IP四层网络模型:链路层、网络层、传输层、应用层
OSI网络模型注重的是通信协议必要的功能是什么,而TCP/IP模型注重的是在计算机是上实现协议要开发哪种程序。
可以利用wireSahrk抓包来看:
TCP三次握手:TCP协议提供可靠的连接服务 ,采用三次连接来建立一个连接:
第一次握手:客户端会建立一个SYN包(syn=j)到服务器,并进入SYN_SEND状态
第二次握手:服务器收到了SYN 包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕后,客户端与服务端进入ESTABLISHED状态,完成三次握手。
TCP四次挥手:
由于TCP是全双工通信,客户端与服务端双方都可以发起关闭连接的请求。加入由客户端端发起的关闭连接的请求
四次挥手:
第一次:客户端向服务端发起释放连接的请求,用于关闭客户端与服务端之间的数据传输,FIN=1,假设序列号seq=u;然后客户端由ESTABLISHED状态进入了FIN_WAIT_1状态
第二次挥手:服务端收到客户单发来的FIN包后,会发送一个确认包给客户端,ACK=1,ack=u+1,假设序列号seq=v;然后服务端由ESTABLISHED状态进入CLOSED_WAIT状态。
客户端收到服务端发送来的确认包后就进入了FIN_WAIT_2状态,等待服务端发送释放连接包FIN
第三次挥手,服务端向客户端发送一个释放连接的请求用关闭由服务端向客户端发送的数据传输,FIN=1,ACK=1,ack=u+1,假设序列号seq=w;然后服务端就进入了LAST_WAIT状态。
第四次挥手:客户端收到服务端发来的私房连接包后,会发送一个确认包给服务端ACK=1,ack=w+1;序列号seq=u+1;然后客户端进入TIME_WAIT状态,服务端收到确认包后会立即进入CLOSED状态,而客户端进过2SML后才会进入CLOSED状态。
建立TCP连接为什么需要三次握手而不是两次或者四次?
建立TCP连接需要三次握手是为了确保双方收发功能正常;第一次握手,客户端什么都不能确,服务端可以确认客户单发送正常;第二次握手,客户端可以确认自己发送接收正常,服务端发送接收正常;服务端可以确认自己接收正常,客户端发送正常;第三次握手:客户端和服务端都可以确认对方自己发送和接收正常。
同时通过三次握手可以确认双方都支持TCP协议,并且告知对方进行TCP传输。
为什么建立连接需要三次握手而断开连接确需要四次挥手?
因为在三次握手的时候,服务端收到客户端发送来的SYN报文,可以同时发送SYN+ACK报文给客户端,SYN是用来同步的,ACK是用来同步的。而在四次挥手的时候,当服务端收到客户端的FIN报文后,SOCKET很可能不会立即关闭,所以只能先回复一个ACK报文给客户端告诉客户端我收到你的释放连接请求了。可能服务端还有些报文没有发送,只有等到服务端的所有报文发送完毕后,服务端才能发送FIN报文给客户端,因为ACK报文和FIN报文不能一起发送所以才需要四次握手。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
2MSL是一个发送和一个回复所需要的最大时间,当客户端发送最后一个ACK报文后,这个ACK报文可能会丢失,如果服务端没有收到ACK将会不断重复发送FIN报文给客户端。所以客户端不能立即关闭,它需要确认服务端已经收到ACK了。客户端会在发送最后一个ACK后进入TIME_WAIT状态,在2MSL时间内,如果再次收到服务端发送来FIN,客户端会重发ACK给服务端然后再等2MSL时间,如果2MSL时间内都没收到服务端发来的FIN报文,那么客户端就可以确认服务端已经收到客户端发送的ACK了,然后就可以关闭了。
如果建立连接后,客户端突然出现了故障怎么办?
假如建立连接后,客户端突然出现了故障,服务端也不会傻傻的等待,这样太耗费资源,TCP有一个保活计时器,每当服务端收到客户端发来一次请求后都会将这个保活计时器复位,时间通常设置为2小时,若两小时内还没有反应,服务器端会每隔75分钟发送一次探测报文,连发10次,如果任然没有反应,这时服务端就会认为客户端出现了故障。