网络编程相关基础知识杂记

关于TCP/IP协议族体系结构以及主要协议:

       TCP/IP协议是一个四层协议系统。

数据链路层:数据链路层实现了网卡接口的网络驱动程序,不同的物理网络存在不同的电气特征,然而网络驱动程序隐藏了这些细节,为上一层协议提供了一个统一的接口。

数据链路层两个常用的协议分别是ARP协议(地址解析协议)和RARP协议(逆地址解析协议)。它们实现了IP地址和机器物理地址之间的转换。网络层通过IP地址寻址一台机器,而数据链路层使用物理地址才能寻址一台机器。

网络层:网络层实现数据包的选路与转发。WAN以及LAN,两台相互通信的机器并不是直接相连的,而是通过多个中间节点(路由器)连接的。网络层的任务就是确定这两台机器的通信路径,同时网络层隐藏了两台机器之间的网络拓扑细节,使得这两台机器看起来就像是直接相连的。

网络层主要是IP协议(Internet Protocol),通过hop by hop确定通信路径。网络层的另一个协议就是ICMP协议,主要用于检测网络连接。

传输层:如下图所示,传输层只关心端对端之间的通信,而不在乎数据包的具体中转过程。下图中,实线的垂直箭头表示TCP/IP协议族各层之间的实体通信,而水平虚线则表示逻辑通信线路。

传输层主要包括三个协议:TCP协议、UDP协议和SCTP协议

TCP协议:Transmission Control Protocol ,传输控制协议,为应用层提供可靠的、面向连接的基于流的服务。TCP使用超时重传、数据确认等方式来确保数据包被正确地发生至目的端,因此TCP服务是可靠地。使用TCP协议通信的双方必须先建立起TCP连接,并在内核中为该连接维持一些必要的数据结构,比如连接的状态、读写缓冲区,以及诸多定时器等。当连接结束后,双方必须通过关闭连接以释放这些内核资源。TCP服务是基于流的,所以数据是没有边界(长度)的,它源源不断地从通信的一段流入另一端。当发送端应用程序连续执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区中。当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或多个TCP报文段发出。因此,TCP模块发送出的TCP报文段的个数和应用程序的写操作次数之间没有固定的数量关系。当接收端收到一个或者多个TCP报文段后,TCP模块将它们携带的应用程序数据安装TCP报文段的序号一次放入TCP接收缓冲区中,并通知应用程序读取数据,接收端应用程序肯恩一次将数据全部读出,也可能分多次读出,这取决于应用程序读缓冲区的大小。

TCP传输是可靠地,是因为TCP采用发送应答机制,即发送端发送的每个TCP报文段都必须得到接收方的应答,才会认为这次传输成功。另外TCP协议采用超时重传机制,发送端在发送出一个TCP报文段之后启动定时器,如果在定时时间内未收到应答,它将重发该报文段。另外,由于TCP报文段最终是通过IP数据包发送的,而IP数据报到接收端可能乱序、重复,所以TCP协议还会对接收到的TCP报文段进行重排、整理,再交给应用层。

UDP协议:User Datagram Protocol,用户数据报协议,为应用层提供不可靠、无连接和基于数据报的服务。如果数据在中途丢失,或者目的端通过数据校验发现数据错误而将其丢弃,则UDP协议就只是简单的通知应用程序发送失败。

关于封装与分用:

socket地址API:

主机字节序和网络字节序:

大端字节序和小端字节序:大端就是整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处,小端是反的

Linux提供的用于完成主机字节序和网络字节序之间的转换的函数:
htonl htons ntohl ntohs 

地址结构体socketaddr 和sockaddr_in,在实际的使用中,socketaddr_in需要类型强制转换为sockaddr。

IP地址转换函数:

in_addr_t inet_addr(const char* strptr):将用点分十进制字符串表示的IPV4地址转化为用网络字节序整数表示的地址。

struct in_addr{

      in_addr_t s_addr;

}

int inet_aton(const char *string, struct in_addr*addr):和inet_addr功能一样,只不过将结果存在它的其中一个指针形参中。

char*inet_ntoa(struct in_addr in):该函数内部用一个静态变量存储转化结果,所以结果是不可冲入的。

int inet_pton(int af, const char *src, void *dst);

const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);

关于高级I/O函数:

pipe函数:用于实现基于管道的进程间通信。

猜你喜欢

转载自blog.csdn.net/qq_23905237/article/details/88371718