客户端与服务端的网络通信
- 1、socket函数
在网络编程中所需要进行的第一件事情就是创建一个socket,无论是客户端还是服务器端,都需要创建一个socket,该函数返回socket文件描述符,类似于文件描述符。 - 2、connect函数
客户端创建了socket后,需要和服务器端建立连接,此时使用connect函数和服务器端进行连接。
connect返回失败后,该套接字不再可用,必须关闭,不能对这样的套接字再次调用connect。 - bind函数
把一个本地协议地址和套接口绑定,比如把本机的2222端口绑定到套接口。注意:为什么在上图中客户端不需要调用bind函数?这是因为如果没有调用bind函数绑定一个端口的话,当调用connect函数时,内核会为该套接口临时选定一个端口,因此可以不用绑定。而服务器之所以需要绑定的原因就是,所以客户端都需要知道服务器使用的哪个端口,所以需要提前绑定。 - listen函数
当socket创建后,它通常被默认为是主动套接口,也就是说是默认为要马上调用connect函数的,而作为服务器是需要被动接受的,所以需要调用linsten函数将主动套接口转换成被动套接口。调用linsten函数后,内核将从该套接口接收连接请求。 - accept函数
此函数返回已经握手完成的连接的套接口。注意:此处的套接口不同于服务器开始创建的监听套接口,此套接口是已经完成连接的套接口,监听套接口只是用来监听。
客户端
int socket (int family ,int type ,int protocol)
int connect (int sockfd , const struct sockaddr *servaddr , socklen_t addrlen) // 自动绑定在了一个临时的端口上,并触发3次握手
int close (int sockfd);
服务器
int socket (int family ,int type ,int protocol)
int bind (int sockfd,const struct sockaddr *myaddr,socklen_t addrlen) // 绑定在一个众所周知的端口上
int listen(int sockfd, int backlog); // 把主动套接口转为被动套接口
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); // 阻塞,直到连接建立,返回一个连接套接字
int close (int sockfd);
参考:
Linux的TCP接口介绍
linux网络编程之二TCP套接口编程
TCP三次握手
由客户端调用connect函数触发,TCP的三次握手。
三次握手
假设 A 为客户端,B 为服务器端。
首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
- A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
- B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时
也选择一个初始的序号 y。 - A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。B 收到 A 的确认后,连接建立。
三次握手的原因
第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。
客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。
TCP四次挥手
- 1.第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
- 2.第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
- 3.第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
- 4.第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1, Server进入CLOSED状态,完成四次挥手。
其他
浏览器地址栏输入网站按回车后发生了什么?
1:解析网址,生成 HTTP 请求信息
2:根据 DNS 服务器查询真实请求的 IP 地址,如果本地服务器有缓存则直接返回
3:得到了 IP 以后,向服务器发送 TCP 连接,TCP 连接经过三次握手。
4:接受 TCP 报文后,对连接进行处理,对 HTTP 协议解析
5:服务器返回响应
6:浏览器接受响应,显示页面,渲染页面
HTTP和HTTPS的区别
HTTP(HyperText Transfer Protocol)和 HTTPS(HyperText Transfer Protocol Secure)是用于在客户端和服务器之间传输数据的协议,它们之间的主要区别在于安全性:
HTTPS增加了【证书认证+加密传输】
数据传输安全性:
HTTP:数据传输是明文的,不加密,容易被拦截和窃听。
HTTPS:数据传输通过 SSL/TLS 加密,保障数据的安全性和机密性,防止拦截和窃听。
协议和端口:
HTTP:使用的是 80 端口。
HTTPS:使用的是 443 端口。
证书和身份验证:
HTTP:不需要证书,不进行身份验证。
HTTPS:需要使用 SSL/TLS 证书,服务器端的证书用于验证服务器的身份,保证通信双方的身份和数据的完整性。
https的请求过程?
GET/POST的区别
数据位置:
GET:数据附加在 URL 查询字符串中,例如:http://example.com/page?param1=value1¶m2=value2
POST:数据包含在请求的消息体中,不可见于 URL。
数据长度限制:
GET:由于数据附加在 URL 中,长度受限于 URL 长度限制,不适合传输大量数据。
POST:没有固定的数据长度限制,适合传输大量数据。
安全性:
GET:因为数据暴露在 URL 中,不适合传输敏感数据,如密码。
POST:数据在请求体中,更适合传输敏感数据。
可书签化:
GET:由于数据在 URL 中,可以被书签保存。
POST:不适合被书签保存,因为数据不在 URL 中。
幂等性:
GET:通常是幂等的,多次请求不会引起状态变化。
POST:不一定是幂等的,多次请求可能引起状态变化,比如向服务器提交表单。
浏览器行为:
GET:请求会被浏览器缓存,如果用户刷新页面,浏览器会直接使用缓存。
POST:浏览器不会缓存 POST 请求,刷新页面会重新发送请求。
用途:
GET:用于获取数据,不应该对服务器端数据产生副作用。
POST:用于提交数据,可以修改服务器端数据。
总的来说,GET 适合获取数据,而 POST 适合提交数据,根据具体的需求和情况选择合适的请求方法。
User
HTTP和HTTPS的区别
ChatGPT
HTTP(HyperText Transfer Protocol)和 HTTPS(HyperText Transfer Protocol Secure)是用于在客户端和服务器之间传输数据的协议,它们之间的主要区别在于安全性:
数据传输安全性:
HTTP:数据传输是明文的,不加密,容易被拦截和窃听。
HTTPS:数据传输通过 SSL/TLS 加密,保障数据的安全性和机密性,防止拦截和窃听。
协议和端口:
HTTP:使用的是 80 端口。
HTTPS:使用的是 443 端口。
证书和身份验证:
HTTP:不需要证书,不进行身份验证。
HTTPS:需要使用 SSL/TLS 证书,服务器端的证书用于验证服务器的身份,保证通信双方的身份和数据的完整性。
速度和性能:
HTTP:由于不需要加密和解密过程,通常比 HTTPS 更快一些。
HTTPS:由于加密和解密的过程,相对于 HTTP 会稍微慢一些。
SEO(搜索引擎优化):
HTTP:在搜索引擎中可能会受到一定的影响,因为搜索引擎越来越倾向于支持安全的网站。
HTTPS:在搜索引擎中有一定的优势,对于 SEO 有一定的好处。
总之,HTTPS 提供了更高的安全性和隐私保护,特别是在涉及用户隐私信息的网站上,使用 HTTPS 是非常重要的。