一、常用知识及函数
---------------------域名系统(Domain Name System,DNS)-------------------
//详见(P250)
DNS:用于主机名字和IP地址之间的映射。
DNS的条目称为资源记录(resource record,RR):
A
AAAA
PTR
MX
CNAME
函数 gethostbyname 根据主机名映射为IPv4地址,它的升级版是getaddrinfo(兼容IPv6和IPv4);
函数 gethostbyaddr 根据IPv4地址映射为主机名.
------gethostbyname
//gethostbyname执行的是对A记录的查询
#include <netdb.h>
struct hostent *gethostbyname(const char *hostname)
//返回:成功:非空指针 出错:NULL且设置h_errno
struct hostent{
char *h_name; //official name of host(主机正式名称FQDN[Fully Qualified Domain Name])
char **h_aliases;//pointer to array of pointers to alias names(指向别名指针数组的指针)
int h_addrtype; //host address type:AF_INET(主机地址类型,IPv4都是AF_INET)
int h_length;//length of address:4(地址长度:IPv4都为4 byte)
char **h_addr_list;//ptr to array of ptrs with IPv4 addrs
}
//如果gethostbyname返回错误会将全局整数变量h_errno设置为<netdb.h>中定义的下列常值之一:
HOST_NOT_FOUND;
TRY_AGAIN;
NO_RECOVERY;
NO_DATA(等同于NO_ADDRESS).
二、
传输层协议
- 用户数据报协议(UDP)
UDP是一个简单的传输层协议:
应用进程往一个 UDP套接字 写入一个消息,该消息随后被封装到一个 UDP数据报,
该 UDP数据报 进而又被封装到一个 IP数据报,然后发送到目的地。
每个UDP数据报都有一个长度。如果一个数据报正确到达目的地,那么该数据报的
长度将随数据一道传递给接收端应用程序。
UDP特性1:
UDP不保证UDP数据报会到达最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,
也不保证每个数据报只到达一次。
故,UDP网络编程缺乏可靠性。
UDP特性2:
UDP提供无连接的服务,因为UDP客户与服务器之间不比存在任何长期的关系。 举例:一个
UDP客户创建一个套接字并发送数据报给一个给定的服务器,然后立即用同一个套接字发送另一个
数据报给另一个服务器。同样的也可以用通一个套接字接收数据报。
UDP特性3:
可以是全双工的。
- 传输控制协议(TCP)
下面是自我总结的TCP特性:
TCP特性1:
TCP提供客户与服务器服务器之间的连接。TCP客户先与某个给定服务器建立一个连接,再跨该连接与该服务器交换数据,最后终止这个连接。
TCP特性2:
TCP提供可靠性。
当TCP向另一端发送数据时,它要求对端返回一个确认。
如果没有收到确认,TCP就自动重传数据并等待更长时间。
在数次重传失败后,TCP才放弃,如此在尝试发送数据上所花的总时间一般为4~10分钟(依赖于具体实现)。
TCP特性3:
TCP不保证数据一定会被对方端点接收,而只是(通过放弃重传并中断连接这一手段)通知用户。
故,TCP也不能被描述成100%可靠的协议,它提供的是数据的可靠递送或故障的可靠通知。
TCP特性4:
TCP提供流量控制。
TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这成为通告窗口窗口。
TCP特性5:
TCP连接时全双工的(full-duplex)。
故在一个给定连接上应用可以在任何时刻在进出两个方向上即发送数据又接收数据。建立一个全双工连接后,需要的话可以把它转换成一个单工连接。
TCP特性6:
TCP含有用于动态估算客户和服务器之间的往返时间(round-trip time,RTT)的算法,
以便它知道等待一个确认需要多少时间。
下面图片显示发送数据排序概念:
TCP三次握手(图解如下):
SYN详解:
通常SYN分节不携带数据,其所在IP数据报只包含一个IP首部、一个TCP首部及可能的TCP选项。
TCP选项: