如何使用http协议访问服务器

在使用http访问远程服务器前我们要先了解重点访问的步骤
总的来说分为3点
1.建立TCP连接(三步握手协议)
第一次
第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
2.发送HTTP协议
HTTP协议的制定
在这里插入图片描述

其中协议版本一般为 HTTP/1.x
这里以HTTP/1.1为例
他定义的请求方法一般有
GET
是以实体的方式得到由请求URI所指定资源的信息,如果请求URI只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述。
POST
用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列中请求URI所指定资源的附加新子项,Post被设计成用统一的方法实现下列功能:
(1)对现有资源的解释
(2)向电子公告栏、新闻组、邮件列表或类似讨论组发信息。
(3)提交数据块
(4)通过附加操作来扩展数据库
HEAD
向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。
其他方法
1.OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
2.PUT:向指定资源位置上传其最新内容。
3.DELETE:请求服务器删除Request-URI所标识的资源。
4.TRACE:回显服务器收到的请求,主要用于测试或诊断。
5.CONNECT:回显服务器收到的请求,主要用于测试或诊断。

URL代表的是网址

下面谈论头部域名称
头部域名称详解
Host
RFC协议规定所有的HTTP请求必须携带Host头,即使Host没有值,也必须带上这个Host头附加一个空串,如果不满足,应用服务器应该抛出400 Bad Request。协议虽然这样规定,不过大部分网关或者服务器都比较仁慈,既然没有指定Host字段,那就给你默认加上一个。
网关代理可以根据不同的Host值转发到不同的upstream服务节点,它常用于虚拟主机服务业务。
所以我们也需要用到Host
我们选择请求方法为GET
下面根据图中的请求方法制定协议,假设我们只访问百度的官网
那么,他的协议可以这样定义
GET / HTTP/1.1\r\nHost:www.baidu.com\r\n\r\n

3.发送连接请求,等待服务器响应

在虚拟机中输入ping www.baidu.com可以得到以下信息163.177.151.109就是服务器的地址在这里插入图片描述
在建立TCP通信的时候HTTP 服务器的默认端口为 : 80

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include  <string.h>
int main()
{
	//1.创建网络通信对象 
	int   tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
			if(tcp_socket < 0)
			{
				perror("");
				return -1;
			}
			else
			{printf("tcp_socket creat ok\n");
		    }
 
	//2.连接服务器   
	 struct sockaddr_in   addr; 
     addr.sin_family  = AF_INET;
     addr.sin_port    =  htons(80); 
     addr.sin_addr.s_addr = inet_addr("163.177.151.109"); //设置百度服务器的 IP地址信息

	int  ret=connect(tcp_socket,(struct sockaddr *)&addr,sizeof(addr));
		if(ret == 0)
		{
			printf("连接成功\n");
		}
		else
		{
			perror("");
			return -1;
		}

	//HTTP 协议 
	char *http = "GET / HTTP/1.1\r\nHost:www.baidu.com\r\n\r\n";     //协议的制定
	
	
	//发送请求给百度服务器 
	    ret=write(tcp_socket,http,strlen(http));
		printf("ret=%d\n",ret);
	

	while(1)
	{
		//接收百度服务器的回应 
		char buf[1024]={0};
		printf("等待服务器回应\n");
		read(tcp_socket,buf,1024);
		printf("%s\n",buf);
	}	
	
}

执行上面代码返回200 ok说明访问服务器成功
在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 7
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

xl575864781

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值