(1)域名解析:解析出ip地址,先本地host文件中找,找不到去本地DNS中找,还找不到去域服务器中找,找到后保存在本地DNS中
(2)封装:浏览器向对应ip的服务器发起请求,请求经历以下四层封装
(3)字符转字节
(4)分用:自下向上分层解析,校验数据完整性
(5)渲染,展示:浏览器解析html
报文格式一般包含:起始行+首部+实体
(1)起始行分和响应起始行(协议版本+状态码+描述文本)
# 请求起始行(方法+请求URL+协议版本)
GET /health HTTP/1.1
# 请求起始行(方法+请求URL+协议版本)
HTTP/1.1 200 OK
(2)首部又分请求首部、响应首部、通用首部、实体首部和扩展首部
HTTP/1.0 200 OK
Server: xxxxxxx
Date: Sun,17 Sep 2019 02:01:16 GMT
--------------------------------实体首部
Content-Type: text/plain
Content-length: 18
--------------------------------实体主体
Hi! I'm a message!
--------------------------------
(3)实体中有HTTP1.1下特定的实体首部
当要传输一个HTTP报文时,报文数据会以流的形式通过一条已经打开的TCP连接按顺序传输,TCP将收到的数据分成小块,每块是一个TCP分组。
由于数据是分成小块的,要保证数据的有序完整,通过确认应答,序列号,校验和来判断,再通过重发控制和窗口机制来校准。
源端口和目的端口:标识发送方和接收方的端口号
TCP段序号:每段报文中的数据的每个字节都有序号,第一个字节的序号从0开始,依次加1,加到2的32次方减1后再次从0开始
首部长度:TCP首部的字节长度
TCP段确认序号:当首部标志ACK为1时,确认序号有效,TCP段被接收端接收后,会回送发送端一个确认号,为上次接受的最后一个字节序号加1
检验和:由发送端计算,接收端验证,如果接收方检测到检验和不正确,表明该TCP段可能有损坏,会被丢弃,同时接收端回送一个重复的确认号,表明接收到的TCP段是错误的,并告知自己希望收到的序号。这时发送端需要立即重传出错的TCP段。
紧急指针:当首部标志位URG为1时,表示紧急指针有效,它是一个正偏移量,和TCP段序号相加。由接收方决定如何处理。
窗口尺寸:决定了TCP一次成块数据流的吞吐量。需要注意的是,它表示发送方允许对方发送的数据量。
首部标志PSH:如果接收方收到PSH为1的标志,需要立即将数据提交给接收进程,不用再等待有没有其他数据进来,这里的数据是和PSH一起传送的数据以及之前接收到的全部数据。
复位标志RST:当RST为1时,表示连接出现了异常情况,接收方将终止连接,通知应用层重新建立连接。
同步序号SYN:用来建立连接。涉及到TCP的三次握手:
1.开始建立连接时,客户端向服务器发送一个TCP分组,分组首部的SYN为1,并携带一个初始序号,表明这是一个连接请求。
2.如果服务器接受了连接,会向客户端发送一个TCP分组,分组会包含SYN和ACK,都为1,同时包含一个确认序号,值为来自客户端的初始序号+1,表示连接已经接受
3.客户端收到上一步发来的分组后,会再向服务器发送一段确认报文分组,ACK为1,会再次携带确认序号,值是来自服务器确认序号+1。服务端收到确认信息后,进入连接状态。
在第三步的确认分组中,是可以携带要发送的数据的。
连接终止FIN:用来关闭连接。
1.如果客户端应用层的数据发送完毕,会导致客户端的TCP报文发送一个FIN,告知服务器准备关闭数据传送。
2.服务器接收到这个标志后,它发回一个ACK,确认序号为收到的序号加1,同时TCP还要向应用程序发一个文件结束符
3.此时服务器关闭这个方向的连接,导致它的TCP也会发送一个FIN。
4.客户端接收到之后发回一个确认ACK,序号为收到的序号 + 1,连接完全关闭。
TCP段序号与确认序号保证了数据的顺序,检验和确保数据的完整性,紧急指针保证紧急数据可被及时处理。另外,TCP还有一些超时重传、拥塞避免、慢启动的机制,都可以保证分组数据按照顺序完整的传到目标端。
如果说TCP分组是包装货物的集装箱,那么IP就是运送集装箱的卡车。IP协议提供了两个节点之间的连接,保证将TCP数据尽可能快的从源端送到终端,但不能保证数据的可靠性。
IP层会将上层传过来的TCP分组封装,带上自己的首部,再进行选路、是否分片以及重组的工作,最终到达目的地。
版本:分别是IPV4和IPV6,当发送和接收的版本不一致时,数据会被丢弃
首部长度:整个首部的长度,最长为60字节
服务类型(TOS):用来区分服务类型,共有5bit,11110分别对应最小时延,最大吞吐量,最高可靠性、最小费用和未用位
总长度:表示当前的数据报报文的总长度,单位为字节,可以结合首部长度计算出报文内数据的大小以及起始位置。
下面三个字段涉及IP数据报的分片和重组,IP数据报在选路时会同时查询当前设备网络层的每个数据帧的最大传输长度,一旦超出,数据报就会被分片,到达目的地再进行重组。
分组标识:这个标识相当于ID,每成功发送一个分片,IP层就会把这个分组ID加1
标志:共占用三位,R目前没有使用;D代表无需分片,一次传输成功;M代表分片,1后面还有数据,0这是最后一个分片
片偏移:标识了当前分片距离原始数据报开始处的位置,分片后,每一片的总长度会改成这一片的长度值,而不是整个数据报的长度。
生存时间(TTL):可以决定数据报是否被丢弃。每经过一层路由,值减去1,当值为0是数据被丢弃,同时发送一个带有错误消息的报文(ICMP,IP层的组成部分,用来传递一些错误信息)给源端。
首部校验和:校验数据报的完整性,发送端对首部求和,接收端接收校验,若不符合则数据报丢弃。
上层协议:决定接收端在分用的时候数据交给哪个上层协议处理,如TCP或UDP。
源IP:记录发送端的IP,在回送错误消息时用到。
目的IP:表示目的IP,每次选路都要以它做决策
IP层会根据目的IP在本机路由表中的查询结果做出选路决策,数据报会逐跳地被运送到目的地,每一跳就是一次路由选择。其中IP层即可配置成路由器,也可以配置成主机。
每收到一个数据报时候,IP层就会根据目的IP在路由表里查询,根据查询状态会导向三种结果:
要是上边三个都没有结果,那么数据报就不能被发送。IP数据报就是这样一跳一跳地被送往目的主机的,但数据报有固有的长度,一旦超出了目的主机的MTU,就会被分片。
ARP协议实现了从IP地址到MAC地址的映射。
IP层接收到TCP分组后,发送或者封装之前,通过查询路由表:
上面所有东西都准备好了,封装发送的其实是以太网数据帧。以太网目的地址、以太网源地址、帧类型这三者组成了帧首部。在首部之前还会插入前同步码和帧开始定界符,告知接收端做一些准备工作。帧检验序列 FCS被添加进尾部,用来检测帧是否出错。
前同步码: 协调终端接收适配器的时钟频率,让它与发送端频率相同。
帧开始定界符: 帧开始的标志,表示帧信息要来了,准备接收。
目的地址: 接收帧的网络适配器的MAC地址,接收端收到帧时,会首先检查目的地址与本机地址是否相符,不是的话就会丢弃。
源地址: 发送端设备的MAC地址。
类型: 决定接收到帧之后将数据交由那种协议处理。
数据: 交给上层的数据。在本文的场景中指IP数据报。
帧检验序列: 检测这一帧是否出错,发送方计算帧的循环冗余码校验(CRC)值,把这个值写到帧里。接收方计算机重新计算 CRC,与 FCS 字段的值进行比较。如果两个值不相同,则表示传输过程中发生了数据丢失或改变。这时,就需要重新传输这一帧。