推荐连接:
bind的高级应用
套接字通信的传输控制层:
Sockets:
基于套接字的通信绝大多数是C/S架构:
Client:发起应用请求的程序;
Server:响应请求(提供服务)的程序;
LISTEN: Socket
传输层协议: TCP, UDP, SCTP
TCP: Transmission Control Protocol
面向连接的协议:双方通信之前需要事先建立虚连接;
UDP:User Datagram Protocol
无连接的协议:双方无须通信之前需要事先建立虚连接;
内核中接收缓冲与发送缓冲
接收缓冲:
本机有多种服务基于TCP协议的,并接收多种协议(http\ftp)数据请求:在tcp层为了完成这些请求,因为本地处理速度比对方发送报文慢一点,因此内核会再内核内存空间找个位置当作接收报文的缓冲空间(接收缓冲)
发送缓冲:
网卡只有一块,我们可以认为它的发信通路只有一个,而网卡是电气设备一次只能向外发送一个报文;如果10个程序过来发报文,网卡由于带宽等原因,真正向外发送的速度比从程序那里接收过来的速度要慢一些;为了不让程序排队,本地可以建立发送缓冲;
问题两边可能可用缓冲区大小并不相同:
站在TCP角度讲,滑动窗口就是告诉对方自己能接收的数据大小;
TCP连接会在有限的状态间进行转换:
在TCP传输连接的建立和释放中的通信双方主机的这些状态称之为“有限状态机”(Finite State Machine,FSM)。
状 态 描述 CLOSED #呈阻塞、关闭状态,表示主机当前没有活动的传输连接或正在进行传输连接 LISTEN #呈监听状态,表示服务器正在等待新的传输连接进入 SYN RCVD #表示主机已收到一个传输连接请求,但尚未确认 SYN SENT #表示主机已经发出一个传输连接请求,等待对方确认 ESTABLISHED #传输连接建立,通信双方进入正常数据传输状态 FIN WAIT 1 #(主动关闭)主机已经发送关闭连接请求,等待对方确认 FIN WAIT 2 #(主动关闭)主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求 TIMED WAIT #完成双向传输连接关闭,等待所有分组消失 CLOSING #双方同时尝试关闭传输连接,等待对方确认 CLOSE WAIT #(被动关闭)收到对方发来的关闭传输连接请求,并已确认 LAST ACK #(被动关闭)等待最后一个关闭传输连接确认,并等待所有分组消失
应用层协议 DNS
DNS: Domain Name Service, 应用层协议
C/S架构,DNS协议运行在53/udp,用来解析的、53/tcp端口,用来做区域传送。
FQDN(Full Qualified Domain Name) 完全限定域名,全局唯一
FQDN是指主机名加上全路径,全路径中列出了序列中所有域成员。全域名可以从逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名的一种完全表示形式。从全域名中包含的信息可以看出主机在域名树中的位置
名称解析:简单来讲就是名称转换
早些时候主机只有几十台,主机之间通信时候的名称转换通过主机本地的hosts文件进行名称解析,我们可以把hosts文件当成一个数据库,存放了主机的ip地址和hostname以及它们的别名(alias),但要想基于主机名来进行通信,还需要一个通用的应用层来实现主机名解析,所以就需要在主机的标准库中定义库文件,这就是getipbyhostname()库和gethostnamebyip()库,当主机想要进行网络间通信时都可以调用这两个库,库文件会通过当前的主机名调或者ip为键来查找hosts文件中与之对应的ip地址或者是主机名,从而就达到了通信的目的。但当主机数量越来越多的时候,再使用这种机制就会很慢,而且这个hosts文件也会太过庞大。后来IANA就通过设置一个DNS服务器来统一完成这些机制,从而解决了这些时效性等问题,但hosts文件这种机制并没有被抛弃,库调用会首先查找当前主机本地的hosts文件如果查找不到就去DNS服务器中查找。
名称解析方式之正向解析
DNS服务器中采用了倒置的树结构,首先在DNS服务器中会有有一个根域(类似于文件系统中的根文件系统),而后在根域后又划分出多个顶级域(TLD),
tld:Top Level Domain
域名分层设计:倒置树状结构,上级包含下级,全球只有13个根节点
分布式数据库系统:将一个大的书库分割成多个小的数据库,分布式管理
组织域:.com, .net, .org, .gov, .edu, .mil
国家域:.iq, .tw, .hk, .jp, .cn, ...
在顶级域后个人或组织可以自己申请二级域来使用。
DNS查询类型:
递归查询:从客户机到自己所指向的DNS服务器
迭代查询:从分布式DNS系统顶端开始查询
DNS名称解析方式:
名称 --> IP:正向解析,名称树 IP --> 名称:反向解析,IP树 例如一个IP地址:222.211.233.244,其逆向域名表达方式为:244.233.221.222.in-addr.arpa 注意:二者的名称空间,非为同一个空间,即非为同一棵树;因此,也不是同一个解析库;
DNS服务器类型:
负责解析至少一个域:主名称服务器; 辅助名称服务器;
不负责域解析: 缓存名称服务器;
DNS解析
一次完整的查询请求经过的流程:
首先查找本机HOSTS表,有就直接使用表中定义,无查找网络连接中设置的DNS 服务器由他来解析
Client --> hosts文件 --> DNS Local Cache --> DNS Server (recursion) --> 1、自己负责解析的域:直接查询数据库并返回答案; 2、不是自己负责解析域:Server Cache --> iteration(迭代) 解析答案分类: 肯定答案:存在查询的键; 否定答案:不存在查询的键,因此,不存在与其查询键对应的值; 权威答案:由直接负责的DNS服务器返回的答案; 非权威答案:不是由直接负责的DNS服务器返回的答案;比如由本地DNS服务器从缓存返回的答案;
主-辅DNS服务器:
主DNS服务器:维护所负责解析的域数据库的那台服务器;读写操作均可进行; 从DNS服务器:从主DNS服务器那里或其它的从DNS服务器那里“复制”一份解析库;但只能进行读操作; “复制”操作的实施方式: 1、序列号:serial, 也即是数据库的版本号;主服务器数据库内容发生变化时,其版本号递增;最长不要超过10位; 2、刷新时间间隔:refresh, 从服务器每多久到主服务器检查序列号更新状况; 3、重试时间间隔:retry, 从服务器从主服务器请求同步解析库失败时,再次发起尝试请求的时间间隔; 4、过期时长:expire,从服务器始终联系不到主服务器时,多久之后放弃从主服务器同步数据;停止提供服务; 5、否定答案的缓存时长: 但主服务器不会只等待刷新时间到来时去同步从服务器,当主服务器数据更新后但并没有到达刷新时间时,它也会自动“通知”从服务器随时更新数据。 主服务器同步方式: 区域传送: 全量传送:axfr, 第一次同步时,传送整个数据库; 增量传送:ixfr, 仅传送变化的数据;
区域(zone)和域(domain)的区别:
bamaface.com域: FQDN --> IP: 正向解析库;正向解析区域 IP --> FQDN: 反向解析库;反向解析区域 区域是物理概念(解析库),域是逻辑概念;
区域数据库文件:
资源记录:Resource Record, 简称rr; 记录有类型:A, AAAA, PTR, SOA, NS, CNAME, MX SOA: Start Of Authority,起始授权记录; 一个区域解析库有且只能有一个SOA记录,而且必须放在第一条; NS: Name Service,域名服务记录;一个区域解析库可以有多个NS记录;其中一个为主的; A: Address, 地址记录,FQDN --> IPv4; AAAA: 地址记录, FQDN --> IPv6; CNAME: Canonical Name,别名记录; PTR: Pointer,IP --> FQDN MX: Mail eXchanger,邮件交换器; 其有优先级概念,范围为0-99,数字越小优先级越高;
资源记录的定义格式:
语法: name [TTL] IN RR_TYPE value name: 1、正向name:FQDN;2、反向name:IP TTL: 一条域名解析记录在DNS服务器上缓存时间;可以统一定义,每条定义记录中省略从全局继承; IN: 关键字,不能省略; RR_TYPE:资源记录的类型; value: 值,可以包含多段组成;
SOA:Start Of Authority:
name: 当前区域的名字;例如”bamaface.com.”,或者“2.3.4.in-addr.arpa.”;点不可省; value:有多部分组成 (1) 当前区域的区域名称(也可以使用主DNS服务器名称); (2) 当前区域管理员的邮箱地址;但地址中不能使用@符号,一般使用点号来替代; (3) (主从服务协调属性的定义以及否定答案的TTL) ;也可以写在一行中用空格隔开; 时间单位:M(分),H(时),D(天),W(天),M(月) 例如: bamaface.com. 86400 IN SOA bamaface.com. admin.bamaface.com. ( 2017010801 ; serial序列号 2H ; refresh刷新时长 10M ; retry重试时长 1W ; expire过期时长 1D ; negative answer ttl否定答案的TTL )
NS:Name Service
name: 当前区域的区域名称 value:当前区域的某DNS服务器的名字,例如ns.bamaface.com.; 注意:一个区域可以有多个ns记录; 例如: bamaface.com. 86400 IN NS ns1.bamaface.com. bamaface.com. 86400 IN NS ns2.bamaface.com.
MX:Mail eXchanger
name: 当前区域的区域名称 value:当前区域某邮件交换器的主机名; 注意:MX记录可以有多个;但每个记录的value之前应该有一个数字表示其优先级; 例如: magedu.com. IN MX 10 mx1.magedu.com. magedu.com. IN MX 20 mx2.magedu.com.
A:Address FQDN --> IPv4;
name:某FQDN,例如www.magedu.com. value:某IPv4地址; 例如: www.bamaface.com. IN A 1.1.1.1 #同一个主机可以有多个记录 www.bamaface.com. IN A 1.1.1.2 bbs.bamaface.com. IN A 1.1.1.1 #同一个主机可以有多个名字
AAAA:Address FQDN --> IPv6;
name:FQDN
value: IPv6
PTR:Pointer
name:IP地址,有特定格式,IP反过来写,而且加特定后缀;例如1.2.3.4的记录应该写为4.3.2.1.in-addr.arpa.; value:FQND 例如: 4.3.2.1.in-addr.arpa. IN PTR www.bamaface.com.
CNAME:Canonical Name
name:FQDN格式的别名;
value:FQDN格式的正式名字;
例如:
web.bamaface.com. IN CNAME www.bamface.com.
注意: (1) TTL可以从全局继承; (2) @表示当前区域的名称; (3) 相邻的两条记录其name相同时,后面的可省略; www.bamaface.com. IN A 1.1.1.1 IN A 1.1.1.2 bbs.bamaface.com. IN A 1.1.1.1 (4) 对于正向区域来说,各MX,NS等类型的记录的value为FQDN,此FQDN应该有一个A记录;