热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux网络通信TCP/IP

一、网络通信网络是通过物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的,通过信息交换实现人与人、人与计算机、计算机与计算机之间的通信。1.网络通信要遵守网络协议

一、网络通信

网络是通过物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的,通过信息交换实现人与人、人与计算机、计算机与计算机之间的通信。

1. 网络通信要遵守网络协议,局域网中最常用的有三个网络协议:MICROSOFT的NETBEUI、NOVELL的IPX/SPX和TCP/IP协议。

a> NetBEUI - 网络基本输入输出系统扩展用户接口。NETBEUI是为IBM开发的非路由协议,用于携带NETBIOS通信。NETBEUI缺乏路由和网络层寻址功能,既是其最大的优点,也是其最大的缺点。

b> IPX/SPX - 互连网包交换/顺序包交换。IPX是NOVELL用于NETWARE客户端/服务器的协议群组,具有完全的路由能力,但是可扩展性受到其高层广播通信和高开销的限制。

c> TCP/IP允许与Internet完全的连接,这是其它协议不具备的。同时具备了可扩展性和可靠性的需求,但是不牺牲了速度和效率。

二、TCP/IP协议

1. 参考模型

国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型。OSI模型包括应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。这个7层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛的应用,其重要的原因之一就在于它过于复杂,但它仍是此后很多协议模型的基础。与此相区别的TCP/IP协议模型将OSI的7层协议模型简化为4层,从而更有利于实现和使用。TCP/IP协议模型包括应用层、传输层、网络层、网络接口层。


2. TCP/IP协议的4层协议

TCP/IP协议是网络中使用的基本通信协议。

网络接口层:网络接口层是TCP/IP的最底层,负责将二进制流转换成数据帧,并进行数据帧的发送和接收。数据帧是网络传输的基本单元。
网络层:网络层负责在主机之间的通信中选择数据包的传输路径,即 路由。当网络收到传输层的请求后,使用路由算法来确定是直接交付数据包,还是把它传递给路由器,最后把数据包交给适当的网络接口进行传输。
传输层:负责实现应用程序之间的通信服务,又称为端到端通信,传输层要提供可靠的传输服务,以确保数据到达无差错、无乱序。为了达到这个目的,传输层协议软件要进行协商。传输层协议软件要把传输的数据流分为分组。
应用层:应用层是分层模型的最高层。应用程序使用相应的应用层协议,把封装好的数据交给传输层或是传输层接收数据并处理。

3. 分层模型图


4. TCP与UDP的概念

TCP(传输控制协议):为应用程序提供可靠的通信连接,适合一次传输大批数据的情况,并适应要求得到相应的应用程序。

UDP(用户数据包协议):提供无连接通信,且不对传送包进行可靠的保证,适合一次传输少量数据。

三、TCP协议

TCP是TCP/IP体系中面向连接的传输层协议,提供全双工和可靠交付的服务,采用许多机制来确保数据的可靠性。

首先,TCP为发送的数据加上序列号,来保证数据能被接收方接收,且只能被正确接收一次。其次,TCP采用具有重传功能的确认技术作为可靠数据流传输服务的基础。由于发送方接收到数据之后会返回一个ACK信号,所以发送方检测ACK信号来判断是否接收成功。如果接收失败,就会重新发送刚才的数据。最后,TCP采用可变长的滑动窗口协议进行流量控制,防止发送方与接收方数据不匹配造成数据丢失。采用可变长的滑动窗口,可以对接收/发送的数据进行动态调节,灵活性更强。

四、UDP协议

UDP也是TCP/IP体系中面向连接的传输层协议,是一种无连接协议,因此不需要三次握手来建立连接。UDP协议比TCP协议更为高效,解决了实时性的问题。


五、TCP例题

(1)TCP服务器

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">#include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <arpa/inet.h>  
  5. #include <sys/types.h>  
  6. #include <sys/socket.h>  
  7.   
  8. #define MAX_SIZE 512   
  9. #define PORT 3332 //端口号  
  10.   
  11. int main()  
  12. {  
  13.     int sockfd;  
  14.     int sock_fd;  
  15.     int recvnum;  
  16.     int addrlen = sizeof(struct sockaddr);  
  17.   
  18.     struct sockaddr_in my_addr;  
  19.     struct sockaddr addr;  
  20.   
  21.     char buf[MAX_SIZE];  
  22.   
  23.    // 填充服务器端的资料,用于套接字绑定  
  24.     bzero(&my_addr,sizeof(struct sockaddr_in));  
  25.   
  26.     my_addr.sin_family = AF_INET; //设置为IPV4  
  27.     my_addr.sin_port = htons(PORT); //将端口号主机序转换为网络序  
  28.     my_addr.sin_addr.s_addr = inet_addr("192.168.1.132"); //IP设置为192.168.1.132  
  29.   
  30.     //创建套接字,TCP/IPV4  
  31.     sockfd = socket(AF_INET,SOCK_STREAM,0);  
  32.     if(sockfd < 0)  
  33.     {  
  34.         printf("create socket error!\n");  
  35.         exit(1);  
  36.     }  
  37.   
  38.     //绑定套接字  
  39.     if(bind(sockfd,(struct sockaddr*)&my_addr,addrlen) < 0)  
  40.     {  
  41.         printf("bind error\n!");  
  42.         exit(1);  
  43.     }  
  44.   
  45.     //监听端口和IP,允许客户端最大数目为3  
  46.     if(listen(sockfd,3) < 0)  
  47.     {  
  48.         printf("listen error!\n");  
  49.         exit(1);  
  50.     }  
  51.       
  52.     //建立服务器和客户端连接  
  53.     sock_fd = accept(sockfd,&addr,&addrlen);//建立连接后产生新的套接字描述符  
  54.       
  55.     if(sock_fd < 0)  
  56.     {  
  57.         printf("accept error!\n");  
  58.         exit(1);  
  59.     }  
  60.   
  61.     //接收数据  
  62.     if((recvnum = recv(sock_fd,(void *)buf,MAX_SIZE,0)) < 0)  
  63.     {  
  64.         printf("recv error!\n");  
  65.         exit(1);  
  66.     }  
  67.       
  68.     buf[recvnum]='\0';  
  69.     printf("recv from client: %s\n",buf);  
  70.   
  71.     memset(buf,0,MAX_SIZE);  
  72.           
  73.     //关闭连接  
  74.     close(sock_fd);  
  75.     close(sockfd);  
  76.   
  77.     return 0;  
  78. }  
  79. span>  
(2)TCP客户端

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">#include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <sys/socket.h>  
  5. #include <sys/types.h>  
  6. #include <arpa/inet.h>  
  7.   
  8. #define MAX_SIZE 512  
  9. #define PORT 3332 //端口号  
  10.   
  11. int main()  
  12. {  
  13.     int sockfd;  
  14.     int addrlen = sizeof(struct sockaddr);  
  15.   
  16.     char buf[MAX_SIZE];  
  17.   
  18.     struct sockaddr_in serv_addr;  
  19.   
  20.     //填充服务器端资料  
  21.     bzero(&serv_addr,sizeof(struct sockaddr_in));  
  22.   
  23.     serv_addr.sin_family = AF_INET;  
  24.     serv_addr.sin_port = ntohs(PORT);  
  25.     serv_addr.sin_addr.s_addr = inet_addr("192.168.1.132");  
  26.       
  27.     //创建套接字,IPV4/TCP  
  28.     sockfd = socket(AF_INET,SOCK_STREAM,0);  
  29.     if(sockfd < 0)  
  30.     {  
  31.         printf("create socket error!\n");  
  32.         exit(1);  
  33.     }  
  34.           
  35.     //连接服务器  
  36.     if(connect(sockfd,(struct sockaddr *)&serv_addr,addrlen) < 0)  
  37.     {  
  38.         printf("connect error !\n");  
  39.         exit(1);  
  40.     }  
  41.   
  42.     memset(buf,0,MAX_SIZE);  
  43.     printf("enter some text:");  
  44.     scanf("%s",buf);  
  45.   
  46.     //发送数据到服务器  
  47.     if(send(sockfd,(void *)buf,MAX_SIZE,0) < 0)  
  48.     {  
  49.         printf("send error!\n");  
  50.         exit(1);  
  51.     }  
  52.       
  53.     //关闭连接  
  54.     close(sockfd);  
  55.   
  56.     return 0;  
  57. }  
  58. span>  

六、UDP例题

(1)UDP服务器

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">#include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <errno.h>  
  5. #include <sys/types.h>  
  6. #include <sys/socket.h>  
  7. #include <arpa/inet.h>  
  8.   
  9. #define PORT 3212  
  10. #define MAX_SIZE 512  
  11.   
  12. int main()  
  13. {  
  14.     int sockfd;  
  15.     int len = sizeof(struct sockaddr);  
  16.   
  17.     char buf[MAX_SIZE];  
  18.     char buffer[MAX_SIZE];  
  19.   
  20.     struct sockaddr_in serv_addr;  
  21.       
  22.     //创建套接字,IPV4/UDP  
  23.     sockfd = socket(AF_INET,SOCK_DGRAM,0);  
  24.     if(sockfd < 0)  
  25.     {  
  26.         printf("create socket error!\n");  
  27.         exit(1);  
  28.     }  
  29.   
  30.     //填充服务器信息  
  31.     bzero(&serv_addr,sizeof(struct sockaddr_in));  
  32.     serv_addr.sin_family = AF_INET;  
  33.     serv_addr.sin_port = htons(PORT);  
  34.     serv_addr.sin_addr.s_addr = inet_addr("192.168.1.132");  
  35.   
  36.     //绑定套接字  
  37.     if(bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr)) < 0)  
  38.     {  
  39.         printf("bind error!\n");  
  40.         exit(1);  
  41.     }  
  42.   
  43.     //循环接收网络上发送来的数据并回复消息  
  44.     while(1)  
  45.     {  
  46.         //接收数据  
  47.         if(recvfrom(sockfd,buf,MAX_SIZE,0,(struct sockaddr*)&serv_addr,&len) < 0)  
  48.         {  
  49.             printf("recv error!\n");  
  50.             exit(1);  
  51.         }  
  52.         printf("recv is: %s\n ",buf);  
  53.               
  54.       
  55.         printf("write some text:");  
  56.         scanf("%s",buffer);  
  57.           
  58.         //发送数据  
  59.         if(sendto(sockfd,buffer,MAX_SIZE,0,(struct sockaddr*)&serv_addr,len) < 0)  
  60.         {  
  61.             printf("send error!\n");  
  62.             fprintf(stderr,"send error:%s\n",strerror(errno));  
  63.             exit(1);  
  64.         }    
  65.     }  
  66.   
  67.     //关闭socket  
  68.     close(sockfd);  
  69.   
  70.   
  71.     return 0;  
  72. }  
  73. span>  

(2)UDP客户端

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:14px;">#include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <errno.h>  
  5. #include <sys/types.h>  
  6. #include <sys/socket.h>  
  7. #include <arpa/inet.h>  
  8.   
  9. #define PORT 3212  
  10. #define MAX_SIZE 512  
  11.   
  12. int main()  
  13. {  
  14.     int sockfd;  
  15.     int fromlen = sizeof(struct sockaddr);  
  16.   
  17.     char buf[MAX_SIZE];  
  18.     char buffer[MAX_SIZE];  
  19.   
  20.     struct sockaddr_in serv_addr;  
  21.   
  22.     //填充服务器信息  
  23.     bzero(&serv_addr,sizeof(struct sockaddr_in));  
  24.     serv_addr.sin_family = AF_INET;  
  25.     serv_addr.sin_port = htons(PORT);  
  26.     serv_addr.sin_addr.s_addr = inet_addr("192.168.1.132");  
  27.   
  28.     //创建套接字  
  29.     sockfd = socket(AF_INET,SOCK_DGRAM,0);  
  30.     if(sockfd < 0)  
  31.     {  
  32.         printf("create socket error!\n");  
  33.         exit(1);  
  34.     }  
  35.   
  36.     //循环发送数据到服务器及接收服务器的回复信息  
  37.     while(1)  
  38.     {  
  39.         printf("enter some text:");  
  40.         scanf("%s",buf);  
  41.   
  42.         //发送数据  
  43.         if(sendto(sockfd,buf,MAX_SIZE,0,(const struct sockaddr*)&serv_addr,sizeof(struct sockaddr)) < 0)  
  44.         {  
  45.             printf("send error!\n");  
  46.             fprintf(stderr,"send error:%s\n",strerror(errno));  
  47.             exit(1);  
  48.   
  49.         }  
  50.   
  51.         //接收数据  
  52.        if(recvfrom(sockfd,buffer,MAX_SIZE,0,(struct sockaddr*)&serv_addr,&fromlen) < 0)  
  53.         {  
  54.             printf("recv error!\n");  
  55.             exit(1);  
  56.         }  
  57.         printf("recv is %s\n",buffer);  
  58.     }  
  59.   
  60.     //关闭socket  
  61.     close(sockfd);  
  62.   
  63.     return 0;  
  64. }  
  65. span>  



推荐阅读
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
author-avatar
手机用户2502939003
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有