完整的tcp通信过程
##让当前shell程序与百度建立连接,8(文件描述符)指向了与百度连接的Socket
exec 8<> /dev/tcp/www.baidu.com/80
##输出http头信息到8,-e表示解析转义字符\n
echo -e "GET / HTTP/1.0\n" 1>& 8
##从8中读取流信息
cat 0<& 8
tcp/ip协议5层模型:
用户层(应用层):为用户的应用进程提供服务
HTTP协议
发送的http请求头.
echo -e "GET / HTTP/1.0\n" 1>& 8
内核层:
1.传输控制层:(确认数据传输)
数据传输协议TCP 或 UDP
####TCP:面向连接,传输可靠.
#####面向连接(三次握手):
双方资源开辟,抛出线程
#####传输字段解释:
URG:紧急指针(urgent pointer)有效。
ACK:确认序号有效。(为了与确认号ack区分开,我们用大写表示)
PSH:接收方应该尽快将这个报文交给应用层。
RST:重置连接。
SYN:发起一个新连接。
FIN:释放一个连接。
SOCKET 套接字:
是一对 ip+port -> ip+port
服务端,ip是固定的;
客户端,ip的随机的(0-65535)
linux中Socket 会映射到fd/某个进程PID绑定.
四次分手:
三次握手到四次分手不可分割:
使用抓包工具抓取,查看http请求(传输控制层)的全部过程:
抓包工具: tcpdump
##访问百度网页 curl www.baidu.com ## -nn 将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示 ## -i 指定监听的网络接口(网卡); ## -X 把协议头和包内容都原原本本的显示出来 tcpdump -nn -i eth0 port 80
抓取结果:
由此结果可见,确认机制,保证传输可靠.
2.网络层(数据传输路径及地址选择):
查看自身网络的一些配置:
ip=网络号+主机号
打开网卡设置:
cd /etc/sysconfig/network-scripts/ ##编辑网卡配置文件 vi ifcfg-eth0
网络层寻址原理:
目标ip地址---->查找路由表------>子网掩码进行与运算—>和网络号做匹配–>如果找不到匹配的网络号–>进入网关(路由器,下一跳)
route -n
路由表
192.168.111:网络号.
192.168.111.2:下一跳(路由器)
下一跳怎么找到下一个下一跳?
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
链路层:
两个相邻结点之间传送数据是直接传送的(点对点),这时就需要使用专门的链路层的协议。
携带数据:
现在找到了网关,现在有两个ip,一个是目标ip,一个是网关ip,怎么携带数据呢?
在网络层携带目标ip,然后再封装一层链路层信息,携带了下一跳的MAC地址:
#####MAC地址:
扩展唯一标识符,每一台联网设备都有自己的MAC地址,记录在网卡中.
arp协议:
地址解析协议,通过已知的下一跳的ip地址,来获取MAC地址成为ARP协议:
网关首先查看自身的[APR缓存表中是否有]目标ip地址的MAC值,
- 如果没有,则会构建广播[ARP广播请求]:
我是192.168.1.5,我的硬件地址是"FF.FF.FF.FF.FF.FE".请问IP地址为192.168.1.1的MAC地址是什么?
- 目标主机接受到之后:
首先将发过来的ip地址和MAC地址,记录到自己的arp缓存表中,然后将自己的MAC地址值发送回去.
这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时A和B还同时都更新了自己的ARP缓存表.
apr协议的使用范围:
1,在同一局域网内;
2,在一段链路中使用.
arp缓存表
arp -a
发起的arp请求:
联络层数据包跳转过程:
将发过来的ip地址和MAC地址,记录到自己的arp缓存表中,然后将自己的MAC地址值发送回去.
这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时A和B还同时都更新了自己的ARP缓存表.
apr协议的使用范围:
1,在同一局域网内;
2,在一段链路中使用.
arp缓存表
arp -a
发起的arp请求: