一文搞懂网络协议

整个计算机和互联网行业,都是建立在数据化和网络传输基础之上的,因此,理解网络传输的模型对于一个计算机人才是十分必要的。

TCP/IP 协议簇是网络协议中的事实标准

一文搞懂网络协议_第1张图片

TCP/IP 协议簇从下到上分为:

​ 网络接口层:定义了物理接口和之上的驱动程序。

​ 网络互联层:定义了IP和路由协议。

​ 传输层:TCP、UDP,定义了线程端口级别的数据交换协议。

​ 应用层:HTTP等,定义了不同问题下的解决方案。

一文搞懂网络协议_第2张图片

可以简单记忆为:WLan =》IP =》TCP =》HTTP

TCP的三次握手

tcp连接的建立,需要客户端和服务端三次交互,目的是为了保障之后的数据传输可以安全可靠地到达。

TCP的报文结构

tcp连接把要发生的数据拆分为一个一个的报文,是面向字节流的协议。

是面向连接的、可靠的(顺序的、无差错的,不重复的和无丢失的)、全双工的(既输出数据、又可以接收数据)、点对点的数据流传输(将要发生的数据划分为报文段,发送连续的数据流,可以提供流量控制和阻塞控制)服务。

一文搞懂网络协议_第3张图片

端口:指明了IP和机器上的具体线程。源端口和目的端口就可以确定一个TCP连接。

序号:该报文段的第一个字节的编号。

确认号:接收方希望接收的下一个TCP报文段的第一个字节的编号。

标识位:用于区分不同类型的TCP报文,目前用到的有SYN、ACK、FIN、RST、PSH、URG。

在建立连接的过程中,用到的TCP报文类型是,SYN和ACK。

SYN:同步位,用于TCP连接建立过程。

ACK:确认位,表示序号字段有效。

三次握手

UserAgent > Server [SYN] 在么
Server > UserAgent [SYN, ACK] 在
UserAgent > Server [ACK] 知道了

一文搞懂网络协议_第4张图片

为啥要第三次握手?

第三次握手时让服务端知道,客户端已经知道了服务端可以接收请求了。防止一些异常情况产生。
比如因为网络原因,第二次握手没有成功,那么客户端就会超时重传第一次握手,如果没有第三次握手的机制,服务端就不知道这次是重传的信息了。

在第一次握手和第二次握手过程中,客户端和服务端都有超时重传机制,因此只有第三次握手成功,双方才真正开始传输数据。

如果没有第三次握手,那么服务端的资源就会被没有确认的客户端消耗,可能永远也没办法进行后续通讯;

死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

四次挥手

UserAgent > Server [FIN] 我要关闭连接了
Server > UserAgent [ACK] 知道了,等我发完包先
Server > UserAgent [FIN] 我也关闭连接了
UserAgent > Server [ACK] 好的,知道了

一文搞懂网络协议_第5张图片

为什么连接的时候是三次握手,关闭的时候却是四次握手?

因为一开始是客户端的单向数据发送,而结束时是双向数据发送。

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

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

基于TCP链接的HTTP协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。

HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

HTTP协议的主要特点

1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

3.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期的http协议是一个请求一个响应之后,直接就断开了,但是现在的http协议1.1版本不是直接就断开了,而是等几秒钟,这几秒钟是等什么呢,等着用户有后续的操作,如果用户在这几秒钟之内有新的请求,那么还是通过之前的连接通道来收发消息,如果过了这几秒钟用户没有发送新的请求,那么就会断开连接,这样可以提高效率,减少短时间内建立连接的次数。

4.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
5、支持B/S及C/S模式。

6、可以基于HTTP实现Rest风格的服务调用。

RCP 和 HTTP

你可能感兴趣的:(小白爱AI,网络,tcpip)