携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
- 网络分层
- 一个http请求的分层解析流程 输入url到地址栏,首先查看浏览器有没有域名对应dns解析缓存(如果有就拿到对应id),如果没有,访问本地hosts(/etc/hosts)文件查看是否有配置映射(如果有就拿到对应id,如果没有,应用层发起一个DNS请求, 创建dns请求报文,调用传输层传输层按照UDP协议,交到网络层,网络层ARP地址解析协议,交给数据链路层,请求报文中增加mac地址。交给物理层,物理层传到路由器,路由器有三层(物理层,数据链路层,网络层),物理层把数据交到数据链路层,数据链路层交到网络层,网络层将数据传输到dns服务器,拿到ip后原路传回浏览器, 浏览器拿到ip,发起http请求,使用TCP协议创建请求报文,交给网络层,增加id地址,交给数据链路层,交给物理层,传到服务器,服务器逆序解析,返回数据原路返回。
http 协议 超文本传输协议 一种无状态的,以请求/应答方式的协议,它使用可扩展的语义和自描述消息格式,与基于网路超文本信息系统灵活互动。
http报文格式
http 协议的请求报文和响应报文基本相同,由三大部分组成:
- start line 起始行 :描述请求或响应的基本信息
- header 头部字段集合:使用key-value的形式详细说明报文
- entity 消息正文:实际传输的数据,可以是文本图片视频的二进制等
请求报文 第一句起始行,下面是请求header
响应报文
TCP是搞物流的。http是搞电商的
- TCP是传输层协议,而HTTP是应用层协议
- HTTP是要基于TCP连接基础上的 (1)序号(sequence number):Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认号(acknowledgement number):Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:
URG:紧急指针(urgent pointer)有效。ACK:确认序号有效。PSH:接收方应该尽快将这个报文交给应用层。RST:重置连接。SYN:发起一个新连接。FIN:释放一个连接。
TCP/IP 协议是传输层的一个面向连接的安全可靠的一个传输协议
三次握手的机制是为了保证能建立一个安全可靠的连接,
两端各自有一个seq,收到的确认响应是ack=收到的seq+1;
- 那么第一次握手是由客户端发起,客户端会向服务端发送一个报文,在报文里面:SYN(发起一个新连接)标志位置为1,序号seq=x。
- 当服务端收到这个报文之后就知道客户端要和我建立一个新的连接,于是服务端就向客户端发送一个确认消息包,在这个消息包里面:ACK标志位置为1,ack(确认序号位)=x+1,确认号为seq,SYN也标识新链接。表示确认客户端发起的第一次连接请求。
- 以上两次握手之后,对于客户端而言:已经明确了我既能给服务端成功发消息,也能成功收到服务端的响应。但是对于服务端而言:两次握手是不够的,因为到目前为止,服务端只知道一件事,客户端发给我的消息我能收到,但是我响应给客户端的消息,客户端能不能收到我是不知道的。所以,还需要进行第三次握手,第三次握手就是当客户端收到服务端发送的确认响应报文之后,还要继续去给服务端进行回应,也是一个ack标志位置1的确认消息。通过以上三次连接,不管是客户端还是服务端,都知道我既能给对方发送消息,也能收到对方的响应。那么,这个连接就被安全的建了。
四次挥手
四次挥手机制也是由客户端去发起
- 客户端会发送一个报文,在报文里面FIN位标志位置一,序号为u
- 当服务端收到这个报文之后,立刻告诉客户端,我知道了,但是我要准备一下,准备完了我告诉你。发送确认收到请求的报文,确认有效ACK=1,确认号seq=v,确认号ack=u(对应请求的seq)+1
- 服务端开始准备,他和还有可能有未发送完的消息,他还要继续发送,准备完成后再发送一个断开连接,结束标识FIN=1,确认号有效ACK=1,seq=w,ack=u(对应请求的seq)+1 4.客户端收到服务端响应后,告诉服务器,已经收到,可以断开链接了,ACK=1,seq=u+1,ack=w+1