HTTP/1.0 默认是短连接;
HTTP/1.1 默认是长连接,(如果阻塞了,还是会开新的TCP连接的) 可以不等响应,继续请求;接收还是按照发送的顺序来的(提出了管线化(pipelining)理论)
HTTP/2 HTTP/2详解 解决了线头阻塞的问题;
HTTPS HTTP与HTTPS的区别
OTA也是采用这种,读取到的数据,存储到flash中,然后在进行升级,细节根据不同硬件平台做处理
端口:80
先通过域名解析,获取IP地址
//DNS域名解析 int err = getaddrinfo(WEB_SERVER, WEB_PORT, &hints, &res);//域名,端口,TCP设置,返回的地址信息创建TCP、socket
按照HTTP协议格式发送请求
//http请求包 static const char *REQUEST = "GET "WEB_URL" HTTP/1.1\r\n" "Host: "WEB_SERVER"\r\n" "\r\n";接收返回数据
json解析
在实际应用中,改动不是很大,主要是底层协议上的修改 后续具体在分析
/* The HTTP/2 server to connect to */ #define HTTP2_SERVER_URI "https://http2.golang.org" /* A GET request that keeps streaming current time every second */ #define HTTP2_STREAMING_GET_PATH "/clockstream" /* A PUT request that echoes whatever we had sent to it */ #define HTTP2_PUT_PATH "/ECHO" /* Set current time: proper system time is required for TLS based * certificate verification. */ set_time(); /* HTTP2: one connection multiple requests. Do the TLS/TCP connection first */ printf("Connecting to server\n"); struct sh2lib_handle hd; if (sh2lib_connect(&hd, HTTP2_SERVER_URI) != 0) //解析url,获取IP地址和接口,并连接 { printf("Failed to connect\n"); return; } printf("Connection done\n"); /* HTTP GET */ sh2lib_do_get(&hd, HTTP2_STREAMING_GET_PATH, handle_get_response); /* HTTP PUT */ sh2lib_do_put(&hd, HTTP2_PUT_PATH, send_put_data, handle_echo_response); while (1) { /* Process HTTP2 send/receive */ if (sh2lib_execute(&hd) < 0) { printf("Error in send/receive\n"); break; } vTaskDelay(2); } sh2lib_free(&hd);说到这里就要提到SSL和TSL
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:(Transport LayerSecurity,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。
端口:443
具体代码看mbedtls
