在网络上,通信的双方通常都是要经过多台计算机或者网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标,这时我们就是靠ARP协议来进行处理。
两张图,完美解析:
数据来源:OSI七层与TCP/IP五层网络架构,个人理解,通过一个http请求的全过程,分析在协议栈中的流转过程
数据来源:OSI七层与TCP/IP五层网络架构详解
具体交互关系:待更新。
三次握手:为什么还需要第三次握手呢?
第三次握手主要是防止已经失效的连接请求又传送到服务器端造成错误
四次挥手:为什么要四次挥手呢?
因为数据的传输是全双工的,即数据的传输是双向的。当浏览器停止给服务器发送数据时,服务器有可能还在给浏览器发送数据。所以,先发送ACK,表示我已经收到请求。服务器需要等自己的数据传输完成后,再告诉浏览器,发送FIN请求。
端口号是什么?有什么用呢
当一台电脑启动了一个可以让远程其他电脑访问的程序,那么它就要开启至少一个端口号来让外界访问。我们可以把没有开启端口号的电脑看作是一个密封的房间,密封的房间当然不可能接受外界的访问,所以当系统开启了一个可以让外界访问的程序后它自然需要在房间上开一个窗口来接受来自外界的访问,这个窗口就是端口。
那么为什么要给端口编号来区分它们呢,既然一个程序开了一个端口,那么不是外部信息都可以通过这个开启的端口来访问了吗?答案是不可以。为什么呢?因为数据是用端口号来通知传输层协议送给哪个软件来处理的,数据是没有智慧的,如果很多的程序共用一个端口来接受数据的话,那么当外界的一个数据包送来后传输层就不知道该送给哪一个软件来处理,这样势必将导致混乱。
当服务器接收到请求后:看下nginx.conf的配置
server {
listen 80; #监听80端口,接收http请求
server_name www.example.com; #就是网站地址
root /usr/local/etc/nginx/www/huxintong_admin; # 准备存放代码工程的路径
#路由到网站根目录www.example.com时候的处理
location / {
index index.php; #跳转到www.example.com/index.php
autoindex on;
}
#当请求网站下php文件的时候,反向代理到php-fpm
location ~ \.php$ {
include /usr/local/etc/nginx/fastcgi.conf; #加载nginx的fastcgi模块
fastcgi_intercept_errors on;
fastcgi_pass 127.0.0.1:9000; #nginx fastcgi进程监听的IP地址和端口
}
}
www.example.com |
|
Nginx |
|路由到www.example.com/index.php |
|加载nginx的fast-cgi模块 |
|fast-cgi监听127.0.0.1:9000地址 |
|www.example.com/index.php请求到达127.0.0.1:9000
|
|
等待处理...
当请求一个www.example.com具体流程如上。