什么是ISP?

网络业务提供商_百度百科

计算机网络有哪些分类方式,计算机网络有哪些分类?_陈泽杜的博客-CSDN博客

路由器_百度百科

目前实际的网络分层是TCP/IP四层协议

当我们浏览⽹站找到想要下载的⽂件以后,找到相应的接⼝点击下载就好了。剩下的⼯作就交给⽹ 络了,那么⽹络是如果传输的呢?

答案就是先封包然后再拆包。实际的远距离传输,可能会涉及多个⽹络,多个路由器。这⾥简化成 ⼀个来表示。我们看到,每⼀层都有相应的控制信息,需要加到数据前⾯,我们把这些控制信息称之为 包头。每层都有不同我包头,⽐如应⽤层可能就是FTP的包头,然后,传输层可能就是TCP包头,再往下 传输层: 应⽤层: 数据的封包与拆包 7 依次就是IP包,以太⽹ (Ethernet),到了物理层以后,上层交下来的数据,就会变成bit流,被放的实 际的物理设备上进⾏传输。

如果⽬标在本⽹络内部,数据就会被直接发送的⽬标主机上⾯,作相反的操作,也就是拆包。⼀般 我们下载的⽂件基本上都存在于远程的服务器。所以,必然要经过多个⽹络,多个路由器。每个路由器 都按照如图所示的步骤,层层拆包,折到⽹络层的IP头以后,和⾃⼰的⼀个叫做路由表的东⻄进⾏⽐ 对,确定⼀个合适的⽹络地址,按照新的⽹络地址再次进⾏封装。下⼀个路由器⽣复这个动作,直到把 数据传送给⽬标主机为⽌。

最后,再由⽬标主机,也就是你的电脑,进⾏拆包。然后把数据展示给你或者直接存储到磁盘上。

网络程序的架构

⽹络程序通常有两种架构,⼀种是

B/S(Browser/Server,浏览器/服务器)架构

⽐如我们使⽤⽕狐浏览器浏览Web⽹站,⽕狐浏览器就是⼀个Browser,⽹站上运⾏的Web就是⼀个服 务器。这种架构的优点是⽤户只需要在⾃⼰电脑上安装⼀个⽹⻚浏览器就可以了,主要⼯作逻辑都在服 务器上完成,减轻了⽤户端的升级和维护的⼯作量。

另外⼀种架构是C/S(Client/Server,客户机/服务器)架构

这种架构要在服务器端和客户端分部安装不同的软件,并且不同的应⽤,客户端也要安装不同的客户机 软件,有时候客户端的软件安装或升级⽐较复杂,维护起来成本较⼤。但此种架构的优点是可以较充分 地利⽤两端的硬件能⼒,较为合理地分配任务。值得注意的是,客户机和服务器实际指两个不同的进 程,服务器是提供服务的进程,客户机是请求服务和接受服务的进程,它们通常位于不同的主机上(也 可以是同⼀主机上的两个进程),这些主机有⽹络连接,服务器端提供服务并对来⾃客户端进程的请求 做出响应。⽐如我们常⽤的QQ,我们⾃⼰电脑上的QQ程序就是⼀个客户端,⽽在腾讯公司内部还有服 务器端器程序。

基于套接字的⽹络编程中,通常使⽤C/S架构。⼀个简单的客户机和服务器之间的通信过程如下: 1. 客户机向服务器提出⼀个请求

2. 服务器收到客户机的请求,进⾏分析处理

3. 服务器将处理的结果返回给客户机 通常,⼀个服务器可以向多个客户机提供服务。因此对服务器来说,还需要考虑如何有效地处理多个客 户机的请求。

这里的ip是公网ip,局域网也一样,在一个局域网内IP也不能相同,他们经过一个路由统一封装成公网ip。

网络桥接_百度百科

从前192.168是专用局域网段

一般不使用的特殊ip

 

IP地址是分等级的地址结构,分两个等级的好处是

(3) 地址掩码 ⼜称为⼦⽹掩码 (subnet mask)。

位数:32 位。

⽬的:让机器从 IP 地址迅速算出⽹络地址。

由⼀连串 1 和接着的⼀连串 0 组成,⽽ 1 的个数就是⽹络前缀的⻓度。

/20 地址块的地址掩码:11111111 11111111 11110000 00000000

点分⼗进制记法:255.255.240.0

CIDR 记法:255.255.240.0/20。

默认地址掩码

 IP地址在Linux当中的实现

IP地址是⼀个32位的数据

通常被封装成如下数据类型

struct in_addr { uint32_t s_addr; };

in_addr_t

uint32_t

常用的熟知端口

计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合比如网络传输和文件储存,几乎都是用的大端字节序。正是因为这些原因才有了字节序。

计算机处理字节序的时候,如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节。小端字节序则正好相反

#include <stdio.h>
typedef unsigned char byte;
typedef unsigned int word;//#define N 1int main(int argc, char *argv[])
{word val32 = 0x11223344;byte val8 = *( (byte*)&val32 );  if(val8 == 0x44)printf("本机是⼩端字节序\n");elseprintf("本机是⼤端字节序\n");int c = 1;//int *a = c;char b = *(char*)&c;printf("%p %d\n",&c ,b);return 0;
}

#include <stdio.h>
#include <arpa/inet.h>
typedef unsigned char byte;
typedef unsigned int word;
int main(int argc, char *argv[])
{word val32 = 0x11223344;byte val8 = *( (byte*)&val32 );if(val8 == 0x44){printf("本机是⼩端字节序\n");val32 = htonl(val32);val8 = *( (byte*)&val32 );if(val8 == 0x44)printf("字节序没有转换\n");elseprintf("转换成功, 现在是⽹络字节序了\n");}return 0;
}

IP地址的转换函数

来个小实验,使用本机的两个虚拟机根据ip和端口号通信

只能一对一谁手快和谁通信

服务器是如何实现每台服务器都是公网IP的呢?

socket分类

 

流式套接字对应TCP数据报套接字对应UDP,所以protocol是0,只用用原始套接字时才需要有参数。

 套接字不知用于网络通信也可用于进程间通信,在网络通信中可选用IIPV4和IPV6

 

!g就是shell中上次输入的g开头的命令

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>int main(int argc, char **argv)
{int fd = socket(AF_INET, SOCK_STREAM, 0);if(fd < 0){perror("socket");exit(0);}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8888);addr.sin_addr.s_addr = inet_addr("192.168.26.128");if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)))//成功0/失败-1{perror("bind");exit(0);}struct sockaddr_in sin;socklen_t sinlen = sizeof(addr);if(getsockname(fd, (struct sockaddr *)&sin, &sinlen)){perror("getsockname");exit(0);}printf("文件描述符%d绑定地址是%s,端口号%d\n", fd, inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));return 0;
}

 

 

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BACKLOG 5//可以有5个等待在队列中int main(int argc, char **argv)
{int fd = socket(AF_INET, SOCK_STREAM, 0);if(fd < 0){perror("socket");exit(0);}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8888);addr.sin_addr.s_addr = inet_addr("192.168.26.128");if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)))//成功0/失败-1{perror("bind");exit(0);}struct sockaddr_in sin;socklen_t sinlen = sizeof(addr);if(getsockname(fd, (struct sockaddr *)&sin, &sinlen)){perror("getsockname");exit(0);}printf("文件描述符%d绑定地址是%s,端口号%d\n", fd, inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));if(listen(fd, BACKLOG)){perror("listen");exit(0);}printf("listen...\n");struct sockaddr_in cin;socklen_t cinlen = sizeof(cin);int newfd = accept(fd, (struct sockaddr *)&cin, &cinlen);//int newfd = accept(fd, NULL, NULL);if(newfd < 0){perror("accept");exit(0);}printf("文件描述符%d绑定IP地址%s,端口号%d\n", newfd, inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));char buf[1024] = {};read(newfd, buf, 1024);printf("%s\n", buf);close(newfd);close(fd);return 0;
}

还是用nc这次可以看连接服务器用户的相关信息

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, char *argv[])
{if(argc != 3){printf("%s [IP][PORT]\n", argv[0]);exit(0);}
/*1.创建套接字*/int fd = socket(AF_INET, SOCK_STREAM, 0);if(fd < 0){perror("socket");exit(0);}
/*2.设置通信结构体*/struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(atoi(argv[2]));sin.sin_addr.s_addr = inet_addr(argv[1]);
/*3.向服务端发起连接请求*/if(connect(fd, (struct sockaddr *)&sin, sizeof(sin))){perror("connect");exit(0);  }socklen_t sinlen = sizeof(sin);if(getsockname(fd, (struct sockaddr *)&sin, &sinlen)){perror("getsockname");exit(0);}printf("文件描述符%d绑定IP地址%s,端口号%d\n", fd, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
/*4.通信*/char buf[1024] = {"test\n"}; //8142  write(fd, buf, strlen(buf)+1);memset(buf, 0, 1024);//printf("input->");//fgets(buf, , stdin);//write(fd, buf, strlen(buf)+1);read(fd, buf, 1024);printf("buf = %s\n", buf);close(fd);return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#define BACKLOG 5//可以有5个等待在队列中int main(int argc, char *argv[])
{if(argc != 3){fprintf(stderr, "%s [IP] [PORT] \n", argv[0]);exit(0);}int fd = socket(AF_INET, SOCK_STREAM, 0);if(fd < 0){perror("socket");exit(0);}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(atoi(argv[2]));addr.sin_addr.s_addr = inet_addr(argv[1]);if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)))//成功0/失败-1{perror("bind");exit(0);}struct sockaddr_in sin;socklen_t sinlen = sizeof(addr);if(getsockname(fd, (struct sockaddr *)&sin, &sinlen)){perror("getsockname");exit(0);}printf("文件描述符%d绑定地址是%s,端口号%d\n", fd, inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));if(listen(fd, BACKLOG)){perror("listen");exit(0);}printf("listen...\n");struct sockaddr_in cin;socklen_t cinlen = sizeof(cin);int newfd = accept(fd, (struct sockaddr *)&cin, &cinlen);//int newfd = accept(fd, NULL, NULL);if(newfd < 0){perror("accept");exit(0);}printf("文件描述符%d绑定IP地址%s,端口号%d\n", newfd, inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));char buf[1024] = {};read(newfd, buf, 1024);printf("%s\n", buf);close(newfd);close(fd);return 0;
}

哈哈天天ping百度百度不爱搭理了,ping一下华清试试

socket有两个缓冲区一个发送一个接收

#include "net.h"
int main(int argc, char *argv[])
{
if(argc != 3)
{
printf("%s [IP][PORT]\n", argv[0]);
exit(0);
}
/*1.创建套接字*/
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if(fd < 0)
{
perror("socket");
exit(0);
}
/*2.设置通信结构体*/
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(atoi(argv[2]));
sin.sin_addr.s_addr = inet_addr(argv[1]);
/*3.向服务端发起连接请求*/
if(connect(fd, (struct sockaddr *)&sin, sizeof(sin)))
{
perror("connect");
exit(0);
}
/*4.通信*/
char buf[BUFSIZ];
while(1)
{
bzero(buf, BUFSIZ);
printf("input->");
fgets(buf, BUFSIZ, stdin);
send(fd, buf, strlen(buf)+1, 0);
printf("buf = %s\n", buf);
if(buf[0] == '#')
break;
}
close(fd);
return 0;
}

 

相关程序参考Linux——UDP_宇努力学习的博客-CSDN博客

先win+R wt 然后telnet

win上没有nc可以用telnet

看以往文章

这里记录一个老师写的大型群体交流服务器

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <wait.h>#define BACKLOG 5void handle(int sig)
{printf("child process exit...\n");wait(NULL);
}int main(int argc, char *argv[])
{if(argc != 3){printf("%s[IP][PORT]\n", argv[0]);exit(0);}signal(SIGCHLD, handle);int fd = socket(AF_INET, SOCK_STREAM, 0);if(fd < 0){perror("socket");exit(0);}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(atoi(argv[2]));addr.sin_addr.s_addr = inet_addr(argv[1]);if( bind(fd, (struct sockaddr *)&addr, sizeof(addr)) ){perror("bind");exit(0);}struct sockaddr_in sin;socklen_t sinlen = sizeof(addr);if(getsockname(fd, (struct sockaddr *)&sin, &sinlen)){perror("getsockname");exit(0);}printf("文件描述符%d绑定的IP地址是%s,端口号%d\n", fd, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));if( listen(fd, BACKLOG) ){perror("listen");exit(0);}printf("listen...\n");pid_t pid;int newfd;char buf[1024] = {};struct sockaddr_in cin;socklen_t cinlen = sizeof(cin);while(1){newfd = accept(fd, (struct sockaddr *)&cin, &cinlen);if(newfd < 0){perror("accept");exit(0);}printf("文件描述符%d绑定的IP地址是%s,端口号%d\n", newfd, inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));pid = fork();if(pid < 0){perror("fork");exit(0);}else if(!pid){close(fd);while(1){memset(buf, 0, 1024);if(!read(newfd, buf, 1024))break;printf("%s\n", buf);}close(newfd);exit(0);}elseclose(newfd);}close(fd);return 0;
}

select实现服务器

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <strings.h>
#include <unistd.h>typedef struct sockaddr Addr;
typedef struct sockaddr_in Addr_in;
typedef struct Node{int fd;struct Node *next;
}Node;#define BACKLOG 5void Argment(int argc, char *argv[]);
void NodeCreate(Node **p);
void AcceptHandle(int sfd, Node **H);
int ClientHandle(int fd);int main(int argc, char *argv[])
{int ret, sfd, nfd = 0;Addr_in saddr;fd_set rfds;Node *H, *p = NULL;Argment(argc, argv);NodeCreate(&H);sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd < 0){perror("socket");exit(0);}saddr.sin_family = AF_INET;saddr.sin_port = htons(atoi(argv[2]));saddr.sin_addr.s_addr = inet_addr(argv[1]);if(bind(sfd, (Addr *)&saddr, sizeof(Addr_in))){perror("bind");exit(0);}if(listen(sfd, BACKLOG)){perror("listen");exit(0);}H->fd =sfd;while(1){FD_ZERO(&rfds);p = H;nfd = 0;while(p != NULL){if(p->fd > nfd)nfd = p->fd;FD_SET(p->fd, &rfds);p = p->next;}printf("nfd = %d run select...\n", nfd);ret =select(nfd+1, &rfds, NULL, NULL, NULL);if(!ret)continue;if(ret < 0){perror("select");exit(0);}p = H;while(p->next != NULL){if(FD_ISSET(p->fd, &rfds)){if(ClientHandle(p->fd) <= 0){close(p->fd);Node *q = p->next;p->fd = q->fd;p->next = q->next;free(q);continue;}}p = p->next;}if(FD_ISSET(p->fd, &rfds))AcceptHandle(p->fd, &H);
#if 1p = H;puts("");printf("Node:");while(p != NULL){printf("%d ", p->fd);p = p->next;}
#endifif(H->next == NULL)break;}close(sfd);free(H);return 0;
}void Argment(int argc, char *argv[])
{if(argc != 3){fprintf(stderr, "%s [addr] [port]\n", argv[0]);exit(0);}
}void NodeCreate(Node **p)
{*p = malloc(sizeof(Node));if(p == NULL){perror("malloc");exit(0);}bzero(*p, sizeof(Node));
}void AcceptHandle(int sfd, Node **H)
{Node *p = NULL;Addr_in caddr;socklen_t caddr_len = sizeof(Addr_in);int cfd = accept(sfd, (Addr *)&caddr, &caddr_len);if(cfd < 0){perror("accept");exit(0);}fprintf(stderr, "client %s:%d connect success.\n",inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));NodeCreate(&p);p->fd = cfd;p->next = *H;*H = p;
}int ClientHandle(int fd)
{int ret;char buf[1024] = {};ret = recv(fd, buf, 1024, 0);if(ret <= 0)return 0;printf("fd=%d buf = %s\n",fd, buf);if(buf[0] == '#')return 0;return ret;
}

Linux——网络编程总结性学习相关推荐

  1. linux 网络编程学习

    linux 网络编程学习  Linux网络编程学习路线 - CTHON - 博客园 (cnblogs.com)

  2. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

  3. Proxy源代码分析--谈谈如何学习linux网络编程

    Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到,Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该是 ...

  4. 编程开发:Linux网络编程学习笔记

    非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...

  5. alin的学习之路(Linux网络编程:十)(http协议,BS模型)

    alin的学习之路(Linux网络编程:十)(http协议,BS模型) 需求:使用B/S模型来访问主机中的文件(包括目录) 0. B/S 模型 注意事项 1. 浏览器请求ico ​ 准备一个favic ...

  6. alin的学习之路(Linux网络编程:一)(网络模型、帧格式、socket套接字、服务器端实现)

    alin的学习之路(Linux网络编程:一)(网络模型.帧格式.socket套接字.服务器端实现) 1. 协议 协议是一组规则,规定了如何发送数据.通信的双发都需要遵守该规则 2. 网络分层结构模型 ...

  7. Linux网络编程学习笔记

    声明:1.未经过原作者许可,不可用于商业行为:2.本笔记仅用于知识学习,如有侵权,立即删除. 1.学习链接 黑马程序员-Linux网络编程:https://www.bilibili.com/video ...

  8. Linux 网络编程学习笔记

    前言: 本文是学习<Linux 高性能服务器编程(游双 著)>时所记录的重点知识. 一.TCP/IP 协议族 二.IP 协议详解 三.TCP 协议详解 四.HTTP 通信 五.Linux ...

  9. [Linux网络编程学习笔记]套接字地址结构

    好久没有看那Linux网络编程这本书了,今天看到了重点部分-TCP套接字.下面先来看看套接字的地址结构 Linux系统的套接字可以支持多种协议,每种不同的协议都是用不同的地址结构.在头文件<li ...

最新文章

  1. 数学基础学习随笔--序言
  2. linux系统下使用xampp 丢失mysql root密码【xampp的初始密码为空】
  3. 【资源共享】RockChip_LCD开发文档v1.6
  4. 华为错误报告在哪个文件夹_华为手机隐藏的这7个秘密小技能,现在开启,手机还能再用3年...
  5. oracle 10g 安装介质,如何从Oracle 10g的安装介质中提取BBED必须的sbbdpt.o和ssbbded.o库文件...
  6. J2SE J2EE J2ME的区别
  7. imagick用法!
  8. 霍金承认有鬼神,为什么霍金和牛顿这些人最后都信神
  9. EBS功能安全性基本原理
  10. leetcode题库221-- 最大正方形
  11. 集成学习(二)——XGBoost
  12. 【java学习之路】(java框架)010.声明式事务控制
  13. Apache James搭建内网邮件服务器
  14. 三角形和矩形傅里叶变换_第3章傅立叶变换.doc
  15. 微信小程序实现拍照功能
  16. ZOJ - 3939 The Lucky Week【简单方法】
  17. 任务一 CC++文件实训
  18. 总算 明白了晾衣杆的原理
  19. 三招沟通小技巧,帮你更好管理领导
  20. 2020年蓝桥杯省赛题目——既约分数

热门文章

  1. centos7安装Navicat
  2. python:画一箭穿心.情人节送给你最爱的人吧!
  3. aardio - vlist虚表控件的使用
  4. CIO:知道谁会购买iPhone 7吗?
  5. JAVA本地方法详解,什么是JAVA本地方法?
  6. .net6 本地运行 无法通过局域网 IP地址访问
  7. 深度学习100例 | 第41天-卷积神经网络(CNN):UrbanSound8K音频分类(语音识别)
  8. MATLAB中nchoosek的用法
  9. Unity设计模式——单例模式与单例框架
  10. 2018 软件测试人员的成长之路---必看!