一、前言
1. 数据包如何传输
当我们在聊天框点击发送,或者在网页点击搜索的时候。我们的主机上和某个遥远的主机建立起了一次通讯。那么就有些许疑问:
- 问题一:消息是如何准确地定位到对方的“聊天框”的?(对方在哪儿)
- 问题二:消息又是如何在茫茫网海中找到对方的“聊天框”?(怎么去)
2. 传输三要素
MAC地址:
用来标识和确定具体的网络设备,以网卡为单位。
IP地址:
IP地址可以具体到网络设备,也可以具体到某个局域网。但是现实情况里,每个人无法都拥有唯一的IP,而是在局域网内共用一个外网IP。
那么IP既不能定位到具体的主机,那么它存在的意义是什么?为什么不直接用MAC地址? —— 那是因为IP地址其实不是用来标识唯一的网络设备的,它是用来帮助交换机简化MAC和端口的映射关系。
具体可以参考 https://mp.weixin.qq.com/s/jiPMUk6zUdOY6eKxAjNDbQ
端口号:
有了IP和MAC地址,可以找到目标主机。但是主机里有很多应用程序,有微信,qq,浏览器。为了区分不同的网络程序,计算机会为每个网络程序分配一个独一无二的端口号,例如,Web 服务的端口号是 80,FTP 服务的端口号是 21,SMTP 服务的端口号是 25。
3. 封装传输方式
对于问题一:已知IP地址 、MAC地址、端口号可以定位到对方的"聊天框"。问题二还没有解决,以下以HTTP为例子,探究数据包如何到达目的地。
主要解决的问题:
- 如何获取对方IP地址,MAC地址,端口号?
- 如何封装解析IP地址,MAC地址,端口号?
- 如何在网络中传输?
二、应用层(HTTP)
1. 应用层的作用
应用层作为数据封装的第一层,它的作用分为几点:
- 封装消息数据
- 获取目的IP地址,端口号(只是获取没有封装,IP在网络层封装,端口号在传输层封装)
对于HTTP协议,消息数据封装在HTTP请求中,而IP地址由DNS域名服务器来获取。
2. URL
2.1 URL概念:平时所说的“网址”,称为资源定位符
2.2 URL作用:用来定位信息文件的位置以及处理方式
2.3 URL格式:[协议类型:] + [//] + [服务器地址] + [端口号] + [文件目录] + [文件名] +[?查询]
示例:https://blog.csdn.net/rushBonez?pid=20230509
协议类型 https 服务器地址 blog.csdn.net 端口号 隐藏,默认80 文件目录 / 文件名 rushBonez 查询 ?pid=20230509
3. HTTP 请求
3.1 HTTP 请求报文
请求行 方法 URL 版本 CRLF 请求头 字段名 : 值 CRLF CRLF 请求体 3.2 HTTP 请求方式# 请求行 GET /rushBonez?pid=20230509 HTTP/1.1 # 请求头 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cache-Control: max-age=0 Connection: keep-alive Cookie: uuid_tt_dd=10_30866679310-1673246305513-461081; __bid_n=1859567c7758abce044207; __gads=ID=65f4de75611b7735-22a87aeb37d9007d:T=1673248879:RT=1673248879:S=ALNI_MZHk3EmtVsJHu-fNEjhIkCD4TanQw; p_uid=U110000; __gpi=UID=00000ba052393925:T=1673248879:RT=1675756277:S=ALNI_MYGD_HgZYiZ3L599UlARx-dfNlJ7Q; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=6525*1*10_30866679310-1673246305513-461081!5744*1*rushBonez; historyList-new=%5B%5D; UserName=rushBonez; UserInfo=e6869afbf3ab465e808d20f1d11246d1; UserToken=e6869afbf3ab465e808d20f1d11246d1; UserNick=%E4%B8%8D%E9%94%88%E9%92%A2%E8%9A%8A%E5%AD%90; AU=6F9; UN=rushBonez; BT=1682326331661; Hm_up_6bcd52f51e9b3dce32bec4a3997715ac=%7B%22islogin%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%2C%22isonline%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%2C%22isvip%22%3A%7B%22value%22%3A%221%22%2C%22scope%22%3A1%7D%2C%22uid_%22%3A%7B%22value%22%3A%22rushBonez%22%2C%22scope%22%3A1%7D%7D; ssxmod_itna=GqUxuD2D07GQ3xBPGKWexjOnIj/eY5e0AKwdD/iDfo4iNDnD8x7YDv+mvKW3a8FEADfGvKZipiPfDheeKeAF9u4GLDmKDyCCEreDxOq0rD74irDDxD3Db3dDSDWKD9D048yRvLKGWDbx=Df4DmDGYneqDgDYQDGqILD7QDIq6qWD64X32B+l=q3exeiqDMIeGXFgWQkeaaaBU4xaWVirQDzMFDtkUB0dLYx0pcRwtV3O4WBY+z87GYFrpeKDmtQDwo+0DiW7xeQBvdYiha07poI7Md7z1PDDfKl+3xD=; ssxmod_itna2=GqUxuD2D07GQ3xBPGKWexjOnIj/eY5e0AKqG9tkiQDBqn747PQqG8mH1riRpu8h7KGFSZApxO3/=EcjpDxok7wse4+L7aeHkm6uNixM=QKuGeI87GcFLI8doiUT2j6dO4uiQ0=r47lw=xPBi9mKHwEFGo3Paj=HapoPK=rPCuQAhT6GG6jOrZDnie2A=vD073n4DLxG73YD=; c_dl_prid=-; c_dl_rid=1683342606887_285869; c_dl_fref=https://www.baidu.com/link; c_dl_fpage=/download/weixin_42120563/18167264; c_dl_um=distribute.pc_search_result.none-task-blog-2%7Eall%7Esobaiduweb%7Edefault-5-38850297.142%5Ev86%5Einsert_down1%2C239%5Ev2%5Einsert_chatgpt; FPTOKEN=wQiASYQ+5Dh3CiTdLdhbJYsBNCIIVj+A6tDOWNcSCD8ifsVrSZRqEhnCSFZy/7iAqyagEMK5cmoUk3Gr09Fv9+L1VYfmJ1RkUd2pXL350eVhgYxFfEwQWC5RLkFnMKKH2dKvK39i7EElaCtUH2IDtIejd8A/LFZZK4+FkkFJm4dlioRUBf0WnpI8dJSeKa9c32/ypblcEQLh2vZLGb9mcfW1n2uf4qpNctzkdw8MwAaaCgKxsckLxnnALn83EeU7k5OjiupoMoNmUZOkrA6rz0dTzlx1XehTrPxIEJGBMCcvzdfg2XkRR1aohQ1vb6VRCtL1gQNy41qXAWlJI4fhIs5zv6hjwhD2xlCpZ8TVw/RBA3GaMfS++nVYvHtnacDgWv7jQ8AoKfo6Iy8eX7S30Q==|Sk+t8xJLNBuTbW6IUcWyBEf7aqe7N6xrVMmDnhViee8=|10|9cc1c93946626ca80985ff23fc256e14; c_segment=9; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1683161006,1683247485,1683333724,1683506592; dc_sid=ac0e4871957543a09d19b7d7d7cbd222; dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MzEzNDg2LCJleHAiOjE2ODQxMzE5OTAsImlhdCI6MTY4MzUyNzE5MCwidXNlcm5hbWUiOiJydXNoQm9uZXoifQ.qrBG_4Ae83f9L9Mt6u-0UiJEfFTRYgPwvf5aSQvsDNM; dc_session_id=10_1683601286339.195021; c_utm_relevant_index=3; relevant_index=3; c_utm_term=http%E8%AF%B7%E6%B1%82%E6%8A%A5%E6%96%87; c_utm_medium=distribute.pc_search_result.none-task-blog-2%7Eall%7Esobaiduweb%7Edefault-0-118670105.142%5Ev86%5Einsert_down1%2C239%5Ev2%5Einsert_chatgpt; referrer_search=1683601357913; c_pref=default; c_ref=https%3A//www.baidu.com/link; c_first_ref=www.baidu.com; c_first_page=https%3A//blog.csdn.net/weixin_45031801/article/details/127481057; c_dsid=11_1683602363441.239634; c_page_id=default; dc_tos=rudfwb; log_Id_pv=1468; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1683602364; log_Id_click=2910; log_Id_view=9133 Host: blog.csdn.net Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: none Sec-Fetch-User: ?1 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 sec-ch-ua: "Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Windows"# 请求体 GET请求无请求体
作用 特点 GET 用来查询数据,不对服务器的数据做任何的修改,新增,删除等操作 安全性低,参数附加在URL后面
无请求体
POST 侧重于创建或更新服务器数据 请求参数在于请求体中 3.3 HTTP 响应报文
状态行 版本 状态码 短语 CRLF 响应头 字段名 : 值 CRLF CRLF 响应体 # 状态行 HTTP/1.1 200 OK # 响应头 Date: Tue, 09 May 2023 03:36:54 GMT Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Accept-Encoding Vary: Accept-Encoding Vary: Origin Set-Cookie: csrfToken=2FnIln6XHKPr12-I4H_i8jU-; Path=/newProxyVersions Expires: Thu, 01 Jan 1970 00:00:00 GMT X-Response-Time: 94 x-xss-protection: 1; mode=block x-content-type-options: nosniff x-download-options: noopen x-readtime: 95 cmsuser: true Content-Encoding: gzip X-Cache: BYPASS X-Request-Id: 53093da0f14f5e37dcc84a6308ecb9fb Server: WAF Connection: close# 响应体
4. DNS(寻找IP地址)
4.1 DNS 概念
- HTTP报文里,就已经包含了要发往服务器的消息(请求体)和服务器的信息(请求行)。然而,传输三要素中的IP,MAC,PORT 在报文里只有一个PORT=80,那么仅有一个端口号定位服务器的位置呢?
- 其实,IP地址的信息早已包含在请求行的URL里,只不过是以域名的形式出现。那么域名和IP地址的关系其实就是手机号和联系人的关系。所以在发送之前,需要查询服务器域名所对应的IP地址。
- DNS 服务器就是专门用来存储Web服务器域名和IP地址的对应关系。
4.2 DNS 层级
根域名服务器
|
|__ 顶级域名服务器
|
|__ 权限域名服务器
|
|__ 本地域名服务器
4.3 DNS 解析过程
第一次递归查询 第二次递归查询 第三次递归查询 4.4 DNS 缓存
为了提高DNS的查询效率,在域名服务器中广泛地使用了高速缓存。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。由于域名到IP地址的映射关系并不是永久不变,为保持高速缓存中的内容正确,域名服务器应为每项内容设置计时器并删除超过合理时间的项。
现在经过应用层之后,消息已经在HTTP报文里面,HTTP报文带着 消息数据 进入操作系统的网络协议栈。
三、传输层
1. 传输层概念
1.1 传输层作用
(1)封装,解析端口号
(2)提供通讯服务
1.2 传输层服务
(1)定位应用程序:将数据包按照端口发送给相应的应用程序
(2)提供通讯保障:网络层只提供传输,不保证传输结果。比如丢包,错序,重复,甚至不确定目标服务器的在线状态
(3)拥塞控制:防止接收端速度太慢造成溢出和丢包的现象
2. TCP 协议
2.1 TCP 功能
(1)建立连接:在发送数据前,先与目标服务器建立起连接,保证双方的收发能力。
(2)校验通信:保证数据的正确性和顺序,防止数据包丢失,防止数据包重复
(3)流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机缓冲区溢出
2.2 TCP 报文头(封装端口号)
typedef struct Tcp_Header {uint16_t srcPort; // 源端口号16bituint16_t destPort; // 目的端口号16bituint32_t seqNum; // 序列号32bituint32_t ackNum; // 确认号32bituint16_t headerLenAndFlag; // 前4位:TCP头长度;中6位:保留;后6位:标志位uint16_t windowSize; // 窗口大小16bituint16_t checkSum; // 检验和16bituint16_t surgentpointer; // 紧急数据偏移量16bit }Tcp_Header;
2.3 TCP 连接机制
2.3.2 TCP 三次握手
2.3.2 TCP 四次挥手
2.4 TCP 工作方式
ACK确认 当TCP发出一个段后等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段 校验和 TCP将保持它首部和数据的检验和。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。 重复丢弃 TCP的接收端丢弃重复的数据 排序 IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层
现在数据包经过传输层的封装之后,可以保证传输数据的 正确和防止数据丢失。现在TCP报文带着 端口号 + 序列号 + 校验 + 消息数据,进入下一层 网络层
四、网络层
1. 网络层的作用
由应用层HTTP已经拿到了IP地址,端口号,消息数据。但是没有经过封装是无法使用IP地址和端口号的。所以经过传输层TCP把端口号封装到了TCP报文头中,而网络层则需要把IP地址封装到IP报文头中,所以网络层在传输中有两个作用:
(1)封装IP地址信息
(2)寻找目标MAC地址
2. IP 协议 (封装IP地址)
typedef struct Ip_Header {int headerLen:4;int version:4;uint8_t tos;uint16_t totalLen;uint16_t ident;uint16_t flags;uint8_t ttl;uint8_t proto;uint16_t checkSum;unsigned char srcIP[4]; /* 源IP地址*/unsigned char destIP[4]; /* 目标IP地址*/
}Ip_Header;
3. ARP 协议(寻找MAC地址)
1. ARP 协议作用
封装完IP报文后,我们已经获得了IP地址 + 端口号 + 序列号 + 校验 + 消息数据。仅剩下MAC地址还没有获取和封装,那么ARP协议的作用就是根据目标IP地址获取MAC地址
注:因为数据包在网络中是无法一步到位直接发送到目的主机上的,而是一个路由一个路由的转发,所以封装的MAC地址不是最终目标的MAC地址,而是下一跳路由的MAC地址
2. ARP 工作流程
在网络层中,每次ARP请求可以获取了下一跳的MAC地址。现在IP报文带着 IP地址 + 端口号 + 序列号 + 校验 + 消息数据,进入下一层链路层
五、数据链路层
1. 链路层作用
- 链路层是实际进行寻找 + 传输的作用层;
- 应用层到网络层,主要用来封装消息和封装报文头,而链路层依靠着IP地址+MAC地址 在网络中寻找目标服务器。
2. MAC 帧结构
typedef struct Eth_Header {unsigned char destMac[6];unsigned char srcMac[6];unsigned char netType[2]; /* IP:0800 ARP:0806 RARP:0835*/
}Eth_Header;
3. 传输原则
在传输过程中虽然MAC地址在不断迭代,但是源主机IP和目标主机IP一直保持不变,这也是保证能顺利送达的保证。