一、TCP/IP协议
1、TCP/IP参考模型
TCP/IP协议模型遵循简单明确的设计思路,包括以下四层协议:
- 网络接口层:负责将二进制流转换为数据帧,并进行数据帧的发送和接受。数据帧是独立的网络信息传输单元。
- 网络层:负责将数据帧封装成IP数据包,并运行必要的路由算法。
- 传输层:负责端对端之间的通信会话连接与建立。传输协议的选择根据数据传输方式而定。
- 应用层:负责应用程序的网络访问,通过端口号来识别各个不同的进程。
2、TCP和UDP
1)TCP向相邻的高层提供服务。因为TCP上一层是应用层,因此,TCP数据传输实现从一个应用程序到另一个应用程序的数据传递。应用程序通过编程调用TCP并使用TCP服务,提供需要准备发送的数据,来区分接受数据应用的目的地址和端口号。它允许数据同网络上的其他节点进行可靠的交换,它能提供端口编号的译码,以识别主机的应用程序,而且完成数据的可靠传输。TCP协议具有严格的内装差错检验算法确保数据的完整性,它是面向字节的顺序协议,这意味着包内的每个字节被分配一个顺序编号,并分配给每个包一个顺序编号。
2)UDP协议是一种无连接协议,不需要像TCP一样建立连接,一个UDP应用可同时作为应用的客户或服务器方。当接收数据时它不向发送方提供确认信息,如果出现丢失或重复的情况,也不会向发送方发出差错报文。由于它执行功能时具有较低的开销,因而执行速度比TCP快。
3、协议的选择
1)对数据要求高可靠性的应用选择TCP协议,如验证、密码字段的传送都是不许出错的,而对数据可靠性要求不那么高的可选择UDP传送。
2)TCP的传送会有较大的延迟,不适合对实时性要求较高的应用,如VOIP、视频监控等。相反,UDP协议则在这些应用中发挥很好的作用。
3)TCP协议主要解决网络的可靠性问题,它通过各种机制减少错误发生的概率。因此,在网络状况不是很好的情况下用TCP协议,但是若在网络状况很好的情况下就不需要采用TCP协议,而是选择UDP协议来减少网络负荷。
二、网络基础编程
1、socket概述
Linux中的网络编程是通过socket接口来进行的,它也是一种文件描述符。通过它不仅可以在本地机器上实现进程间的通信,而且通过网络能够在不同的机器上的进程之间进行通信。socket也有一个类似打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立等操作都是通过socket来实现的。
socket类型常见有以下三种:
- 流式socket(SOCK_STREAM):流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,保证了数据的正确性和顺序性。
- 数据报socket(SOCK_DGRAM):数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,而且不保证是可靠、无差错的。使用数据报协议UDP。
- 原始socket:允许对底层协议进行直接访问,功能强大但使用不便,主要用于一些协议的开发。
2、地址及顺序处理
1)地址结构相关处理
一种常用的用于保存网络地址的数据结构sockaddr_in,其结构如下:
struct sockaddr_in
{
short int sin_family; /*地址族*/
unsigned short int sin_port; /*端口号*/
struct in_addr sin_addr; /*IP地址*/
unsigned char sin_zero[8]; /*填充0*/
};
该结构sin_family字段可选常见值:
AF_INET:IPv4协议
AF_INET6:IPv6协议
AF_LOCAL:UNIX域协议
AF_LINK:链路地址协