网络基础
**协议:**就是制定的规则
典型的协议
应用层 HTTP FTP
传输层 TCP/UDP
网络层 IP、ICMP、IGMP
网络接口层 ARP、RARP
OSI
封装好的数据包如何在两个客户端通信
路由结点中会有一个路由表,会记录当前路由器连接了哪些路由,数据包中会记录目标ip地址,因此找最接近的IP路由进行选择,
TCP协议建立的路由是固定的,UDP建立的是不固定的,每次都进行一次寻路操作。
以太网帧格式
目的地址与源地址对应的是mac地址,ARP请求包获取下一跳要经过的路由器的mac地址 PAD表示填充。
ARP数据报中的目的地址封装的是路由的下一跳地址,真正的目的ip封装在网络层的ip协议中,并且每次发送至下一跳都必须进行数据的打包和解包工作,每经过一个路由器,需要解掉以太网帧头和帧尾,和网络层协议,需要获取目的ip
TTL:为了防止网络瘫痪等问题引起的数据报在网络中无休止的循环发送从而拥塞网络,需要设置下一跳的上限次数。TTL即为数据报在网络传输中的最长生命周期。
IP段对应于以太网帧中的数据段部分
端口号用来描述进程;例如用qq发送。
NAT映射
局域网IP在公网中是不可见的,NAT映射表,存在于路由器中,在路由器中传播使用的是映射地址,同一个公网ip通过使用不同的端口号来完成局域网ip地址映射。
打洞
什么是打洞,我们假设两个扣扣A,B,他们通信需要通过腾讯的服务器。也就是A发送消息给B的话,需要通过腾讯服务器进行一次转发,才到B那里。但像视频通话这种实时性要求比较高的通信,再用这种方式就不能保证他们通信的实时性,如果能想一个办法让他们直接通信,这样实时性就会高很多。但是我们所知的路由器是有一个保护机制的(对于陌生的IP第一次发送过来的数据包,会进行屏蔽或丢弃,主要是为了防止网络的恶意攻击),A跟B想进行通信的话所携带数据包的IP就必须是熟悉的,所以说这个时候就需要在两个路由器之间打一个洞,而这件事情上腾讯就参与进来了。
简单来说在我们登入扣扣的时候,就会访问腾讯服务器,而腾讯服务器也会回一个数据包,这个数据包会携带腾讯服务器公网的IP,相对于来说服务器的公网IP在A、B那里都是熟悉的IP(就是为了防止陌生IP屏蔽),而服务器借助公网IP帮助A、B完成打洞(打洞就是实现一种通路),当它把这个洞打好以后A、B就可以实时通信。打洞是由服务器来完成的,最终的目的就是为了提高数据传输的效率。
Socket编程
IP地址:可以在网络环境中唯一的标识一台主机 端口号:可以在主机之中唯一标识一个进程 ip+端口号:在网络环境中唯一标识的一个进程(socket)
linux 文件类型 : 普通文件、目录、链接文件、字符设备、块设备、管道、套接字。
网络字节序
TCP/IP协议规定,网络字节序应采用大端字节序,即低地址高字节,为了使网络程序具有可移植性,可调用以下库函数做网络字节序和主机字节序的转换。
ip地址转换函数
socketaddr 数据结构
sturct socketaddr,早期使用这个结构体名,现在已经废弃,但是在调用网络套接字一些库函数时仍然需要对参数将socketaddr_in进行强制类型转换。