服务器之间的请求与响应
IP地址 xxx.xxx.xxx.xxx
互联网就像是一张网,ip地址就是网上每个节点的地址。
查看ip的方法
1 |
PING www.bingxiong.vip |
有时候IP会变,比如PING百度的时候,因为百度的服务器是很多台。
查看自己的IP使用ifconfig(LINUX下)或者ipconfig(windows)
域名解析:
浏览器根据域名找到ip的过程就是叫做域名解析。
网络中有很多的设备,如果访问每个设备都要通过ip来访问,那么很难记住,因此就要使用域名解析,给服务器起名字,让域名对应上ip地址。
本机的表在
这就是说为什么可以通过localhost这个域名找到了本机127.0.0.1
在网上也有这张表,存放这张表的很多很多服务器叫做DNS(域名服务器)
DNS:负责IP地址与域名之间的转换
因此浏览器请求baidu的时候,就会先去DNS上找这个对应ip的关系。
三次握手
这里发送的序列号是为了区别是哪一次连接,因为浏览器可能会发送多次请求了
命令行查看三次握手:
请求与响应
三次握手之后就建立起连接了,然后开始浏览器的请求和服务器的响应
浏览器发送请求的之后,服务器收到请求了会发送一个ack的响应,这个因为服务器处理请求可能需要一点时间,如果时间比较长,浏览器就会认为丢包了,因此就会再次发请求,因此服务器收到请求之后就会立即发送一个ack告诉浏览器我收到请求了,不要再发了。
可以使用:
1 |
sudo tcpdump -c 10 -v host 104.193.88.77 |
查看请求百度ip的前10个数据包,在这个数据包中,前三个是三次握手,之后开始请求和响应。
四次挥手
四次挥手是用于断开连接,断开浏览的过程叫做四次挥手,四次挥手的发起者可能是浏览器也可能是服务器,这里写的是主机,主机可能是浏览器也可能是服务器。
1.首先主机1发送一个fin数据包,请求断开;
2.主机2返回一个ack的数据包,这个数据包可能会告诉浏览器,现在还不能断开,我还有处理中的任务,
3.主机2处理完毕之后就会发送一个fin的数据包告诉主机1可以断开了
4.然后主机1就发送一个ack数据包,告诉可以断开了
然后主机1和主机2都关闭了自己。
一些问题:
1.第四次挥手是否真的有必要?
有必要,因为如果主机1没有响应,主机2会认为主机1没有收到fin数据包就会重复发送第三次挥手的fin数据包,导致二者没有办法正常的进行断开。
2.主机2在ack和fin之间做了什么事情?
假设主机2 是服务器,那么服务器可能在请求&响应的阶段处理请求,但是可能主机1请求断开的时候,主机2还没有处理完请求,因此就需要ack来告诉主机1,我还没有处理完。
3.服务器如何知道响应丢失了?
响应数据包可能是多个数据包,浏览器在收到每个响应数据包都会立即回复ack数据包,服务器根据这个ack数据包来判断浏览器有没有收到。
4.主机1怎么知道最后的ack是发送成功了?
主机1在发送最后的ack之后不会立即关闭,会等待很长的一段时间,大概30s-2分钟,假设ack数据包处于丢失的情况,其实这段时间内并不会重新发送ack,这里就涉及到上一步,由于主机2没有收到ack所以还在上一步发送fin数据包的状态,由于主机2 没有收到ack,因此还会继续发送fin,因此在主机1等待的这段时间里面如果收到了主机2的fin数据包就知道主机2没有收到ack数据包了。