1.网络编程-概念套接字编程网络体系结构网络体系结构指的是网络的层次结构和每一层所使用的协议的集合实现网络传输的功能非常繁杂所以采用了分而治之的设计方法把网络的功能划分为不同的模块以分层的形式有机地组合在一起。每一层地实现功能和任务是不用的其内部实现方法对外部其他层来说是透明的。每一层都为上一层提供服务同时使用下一层所提供的服务。OSI模型与TCP/IP模型OSI模型相关的协议已经非常少使用但是模型本身非常通用。OSI模式是一个理想化的模型至今尚未由完整的实现一共有七层应表会传网数物TCP 协议TCP协议包含两个方面tcp传输协议用来检测网络传输中差错的传输控制协议ip 网际协议专门负责对不同网络进行互联的互联网协议IP通俗的来说TCP是专门负责传输过程中的出错问题一旦出现传输的问题TCP协议则会介入处理并把出错的数据包重新传输直到数据安全到达为止。而IP协议则是在网络中负责不同的网络之间的通信给网络中的每一台主机分配一个不同的IP地址TCP / IP 模型 (协议簇)TCP/IP协议事实上是一个工业标准。TCP/IP协议指的是能够在多个不同的网络间实现信息传输的协议簇。该协议并不是只由 TCP 和 IP协议组成而是由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇。只是TCP IP 协议比较有代表性所以被称为TCP/IP协议。TCP/IP只有4层自下而上了解TCP/IP协议网络接口和物理层物理层的主要设备就是中继器和集线器交换机/路由封装成帧在数据的前后分别加上开始《纠错以及修正》和结束的标记后便构成了一帧每一个数据链路层都规定了所能传输的一针数据中数据的长度上限称为最大传输单元MTU透明传输指的是不管数据的二进制是如何组合都应该能够正常传输而不会被误以为是某些控制的命令确保数据安全到达差错检测在传输的二进制编码中加入适当的冗余度使得接收者可以发现在传输中是否出现了差错TCP /IP 协议的数据包组成数据的封装与传递过程发送端将数据进行打包封装接收端将数据包进行解析获取数据补充什么是FTPFTP是什么其实通俗的说FTP是一种数据传输协议负责将我们电脑上的数据与服务器数据进行交换比如我们要将在我们电脑中制作的网站程序传到服务器上就需要使用FTP工具将数据从电脑传送到服务器。专业的说FTP全称File Transfer Protocol是TCP/IP网络上两台计算机传送文件的协议FTP是在TCP/IP网络和INTERNET上最早使用的协议之一它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件上载文件创建或改变服务器上的目录一般我们均是将我们电脑中的内容与服务器数据进行性传输。其实电脑与服务器是一样的只是服务器上安装的是服务器系统并且服务器稳定性与质量要求高些因为服务器一般放在诸如电信等机房中24小时都开机这样我们才可以一直访问服务器中的相关信息。FTP服务器是什么但是还有一个FTP服务器概念大家不要混淆掉了。我们可以再电脑中安装FTP工具负责将电脑中的数据传输到服务器当中这是服务器就称为FTP服务器而我们的电脑称为客户端。简单的说FTP服务器就是一台存储文件的服务器供用户上传或下载文件。原文链接https://blog.csdn.net/chehec2010/article/details/845811852.网络编程知识储备Socket --- 插座在计算机通信领域socket 被翻译为“套接字”是一个编程接口是一个特殊的文件描述符不仅仅局限于TCP/IP协议面向连接 TCP视频通话无连接 UDP 发微信消息很多的应用 都依赖于socket的接口例如FTP\TELNET等什么是socket?独立于具体协议的网络编程接口在OSI模型中主要位于会话层和传输层之间Socket的类型流式套接字 SOCK_STREAM TCP提供一个面向连接、可靠的数据传输服务数据无差错、无重复、地发送并按顺序抵达。内设流量控制避免数据流淹没前面的数据。数据被查看时字节流无长度限制。数据报套接字SOCK_DGRAM UDP提供无连接服务数据包以独立数据包形式被发送不提供无差错保证数据有可能丢失或重复到达顺序发送可能会乱序接收原始套接字SOCK_RAW可以直接访问较低层次的协议例如 IP\ICMP。为什么需要socket普通IO操作的过程打开文件 读/写操作 关闭文件Socket文件的操作在同一个机器上的两个程序可以简单的通过某一个相同的文件进行数据的交流和传输但是如果在网络中两个进程完全不存在统一个机器那需要如何打开网络协议具有多样性如何进行统一的操作Socket的位置IP地址IP地址是网络中主机(电脑)的标识在网络中主机想要与其他机器通信就必须拥有一个自己的IP地址IP地址为32位IPV4或者128位IPV6每一个数据包都必须携带目的地址IP和源IP地址路由器依靠此信息为数据包选择最优路由路线点分形式如 192.168.100.2 在传输过程中都会被转换为一个32位无符号的整数IPv4地址IPv4地址的概念是在1980年代初期提出的。即使有新版本的IP地址IPv4地址仍然是Internet用户使用最广泛的地址。通常IPv4地址以点分十进制表示。每个部分代表一组构成8位地址方案8位地址方案8位地址方案的8位地址。如 192.168.100.2IPv6地址IPv6地址IPv6地址IPv6地址并不是一种全新的技术。它是Internet协议的最新版本但它是在1998年开发的旨在替换IPv4地址。IPv6地址使用以冒号分隔的十六进制十六进制十六进制数字。它分为八个16位块构成一个128位地址方案。如​。端口号 用于区分计算机中某一个具体的程序用于区分一台主机中接收到的数据包应该转交给哪一个进程进行处理。TCP端口号与UDP端口号是相互独立的端口号一般由IANA(Internet Assigned Numbers Authority) 统一管理众所周知端口 1 - 10231-25之间为众所周知端口 256 - 1023 为UNIX系统占用何为总所周知端口其实就是早已固定号的端口比如80端口分配给WWW服务21端口分配给FTP服务等注册端口 1024 -49151分配给进程或者应用。这些端口号在还没有被服务器资源占用时可以由用户的APP动态注册获得。动态端口号49152 - 65535被称为动态端口号他一般不固定分配某种服务而是动态分配的。一般可以使用65000 以上的自己就可以随便用​字节序不同的CPU 主机中内存存储多个字节的序列分为两种这个称为主机字节序小端序Little-Endian低序低有效位存储在低地址起始地址Intel\AMD 等采用的方式大端序(Big-Endian)高序高有效位存储在低地址 ARM采用的存储方式例如0x12345678在小端序中存放时12 34 56 78高地址 --------- 低地址在大端序中存放则相反78 56 34 12高地址 --------- 低地址为了避免在不同的处理器中收到的数据出现字节序带来的问题因此网络中传输的数据必须按照网络字节序来处理也就是大端序。发送者在发送数据前必须先转换为网络字节序大端序而接收者需要在收到网络中的数据时再转换为自己合适的主机字节序。字节序转换API函数端口号的转换1 头文件 2 #include arpa/inet.h 3 4 函数原型 5 uint32_t htonl(uint32_t hostlong); // 主机字节序到网络字节序 无符号长整型 6 7 uint16_t htons(uint16_t hostshort);// 主机字节序到网络字节序 无符号短整型 8 9 uint32_t ntohl(uint32_t netlong); // 网络字节序转为主机字节序 无符号长整型 10 11 uint16_t ntohs(uint16_t netshort); // 网络字节序转为主机字节序 无符号短整型IP地址转换1 //头文件 2 #include sys/socket.h 3 #include netinet/in.h 4 #include arpa/inet.h 5 6 函数原型 7 // 把cp指向的字符串转换为32位的网络字节序的二进制值存于inp中 8 // cp 点分十进制的网络地址的字符串 IP地址 9 int inet_aton(const char *cp, struct in_addr *inp); 10 11 // 把cp指向的字符串转换为32位的网络字节序的二进制值并返回 12 in_addr_t inet_addr(const char *cp); 13 in_addr_t inet_network(const char *cp); 14 15 // 把in中的32位网络字节序的二进制地址转换为点分十进制的字符串 16 char *inet_ntoa(struct in_addr in);