URL请求流程和ip addr解读

发起一次URL请求流程

  1. 在浏览器输入URL http://wangjialun.top/
  2. 浏览器通过DNS或者HTTPDNS去查找IP地址
  3. 知道目标地址后,浏览器会将请求打包,普通请求使用HTTP协议或者使用HTTPS加密传输
  4. DNS,HTTP,HTTPS所在的层为应用层,经过应用层封装后,浏览器会通过socket编程将应用层的包交给下一层传输层
  5. 传输层有两种协议,一种无连接的协议UDP,一种面向连接的协议TCP,TCP协议会保证这个包能够到达目的地,如果不能到达会重新发送
  6. TCP协议里面会有两个端口,一个是浏览器监听的端口,一个应用服务器监听的端口,操作系统一般通过端口来判断,得到的包交给哪个进程
  7. 传输层封装完毕后,浏览器会将包交给操作系统的网络层,网络层协议是IP协议,在IP协议中会有源IP地址,即浏览器所在机器IP地址和目标IP地址
  8. 操作系统知道目标IP后会通过CIDR进行判断,是否在局域网内,如果不在局域网内会获取DHCP或者手动配置的网关IP地址,通过ARP协议获取到MAC地址
  9. 操作系统接着将IP包交给下一层MAC层,网卡再将包发出去,因为包里面有MAC地址,所以可以到达网关
  10. 网关收到包以后,会根据路由表判断下一步怎么走,类似一个路由器通过OSPF和BGP路由协议获取到目标IP所在的MAC地址,网络包过关后通过这个MAC地址找到目标服务器
  11. 目标服务器校验MAC地址一致,取下MAC头,发送给操作系统的网络层,发现IP一致后取下IP头,IP头里面写上一层封装的TCP协议,然后交给传输层TCP,TCP对于收到的每个包都有一个回复的包说明收到了(注意这个不是请求的结果),回复沿路返回
  12. 网络包到达TCP层后,TCP头里面有目标端口号,通过这个端口号找到服务器监听这个端口的进程,将网络包发给这个进程应用

ip addr 解读

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
   valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:0c:3b:19 brd ff:ff:ff:ff:ff:ff
inet 172.16.12.178/18 brd 172.16.63.255 scope global dynamic eth0
   valid_lft 301621714sec preferred_lft 301621714sec
  • IP 地址后面有个scope eth0 这张网卡是 global 说明 eth0 这种网卡可以对外,可以接收来自各个地方的包,

    lo 的后面是host,说明这张网卡仅可以本机相互通信

    • lo 全称是loopback,又叫环回接口,通常被分配为127.0.0.1,这个地址用于本机通信,经过内核处理后直接返回,不在任何网络中出现
  • MAC地址

    • IP地址的上一行是 link/ether 00:16:3e:0c:3b:19 brd ff:ff:ff:ff:ff:ff ,这个地址是MAC地址,是网卡的物理地址,用十六进制,6个byte表示,MAC地址是唯一标识,具有一定的通信范围,局限在一个子网里面
  • 网络设备的状态标识<BROADCAST,MULTICAST,UP,LOWER_UP>(net_device flags)

    • UP 表示网卡处于启动状态
    • BROADCAST 表示这个网卡有广播地址,可以发送广播包
    • MULTICAST 表示网卡可以发送多播包
    • LOWER_UP 表示 L1 是启动的,即网线插着
    • MTU 1500 是指最大传输单元MTU为1500,这是以太网的默认值
    • qdisc pfifo_fast 全称 queueing discipline(排队规则), 内核如果需要通过某个网络接口发送数据包,都需要为这个接口配置qdisc(排队规则)把数据包加入队列
      • 最简单的 qdisc 是 pfifo, 不对进入的数据包做任何处理,数据包采用先入先出方式通过队列
      • pfifo_fast 的队列包含 三个波段(band).在每个波段中使用先进先出规则,三个波段的优先级也不同,band 0 的优先级最高 band 2 的最低, 如果band 0 里面也数据包, 系统不会处理band 1 里面的数据包,band 1 和 band 2 之间也一样, 数据包按照服务类型(Type of Service, TOS) 被分配到多个波段(band)里面,TOS 是 IP头里面的一个字段, 代表当前的包是高优先级还是低优先级的
### 如何在C语言中读取HTTP请求 为了理解如何在C语言中处理HTTP请求,可以考虑使用`libwebsockets`库来简化网络通信操作。安装此库可以通过终端命令完成: ```bash bash install_libwebsockets.sh ``` 一旦有了合适的开发环境支持库,就可以着手构建能够解析并响应HTTP请求的应用程序[^1]。 对于具体的实现细节,在C语言里读取HTTP请求通常涉及以下几个方面的工作: #### 创建套接字连接 创建服务器端监听套接字,并接受来自客户端的新连接。这一步骤是建立任何基于TCP/IP协议的服务的基础。 ```c #include <sys/socket.h> #include <netinet/in.h> int sockfd; struct sockaddr_in server_addr; // Create socket file descriptor if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Socket creation error"); } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = INADDR_ANY; bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); listen(sockfd, 3); // Listen for incoming connections ``` #### 接收数据包 当有新的连接到来时,接收其发送的数据流,这些数据即包含了完整的HTTP请求头以及可能存在的实体主体部分。 ```c char buffer[BUFFER_SIZE]; read(new_socket_fd, buffer, BUFFER_SIZE); printf("%s\n", buffer); // Print out received data ``` 上述代码片段展示了基本的文件描述符读写方式,实际应用中应当更加严谨地对待边界条件错误情况处理[^3]。 #### 解析HTTP头部信息 通过字符串分割函数或其他方法提取出URL路径、查询参数、HTTP版本号等重要字段;同时也要注意支持分块传输编码(chunked transfer encoding),因为现代浏览器可能会采用这种方式上传大尺寸资源给Web服务端。 ```c void parse_http_request(const char *request_string){ const char s[2]=" "; char *token; /* get the first token */ token=strtok(request_string,s); while(token!=NULL){ printf("%s\n",token ); // Process each part of request line here... token=strtok(NULL," "); } } ``` 以上就是关于怎样利用C编程语言去解读由客户机发出的标准超文本传输协议消息的大致流程介绍。值得注意的是这里给出的例子较为简单,真实场景下的需求往往更为复杂多变,因此建议开发者们深入研究相关标准文档技术资料以获得更全面的知识体系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值