新手做网站选材,做网站代理工作安全吗,服务器网站建设教程,门户网站的传播特点linux网络编程#xff08;一#xff09;网络传输基础知识一、什么是协议#xff1f;二、使用步骤典型协议2.网络应用程序设计模式C/S模式B/S模式优缺点3.分层模型4.TCP/IP四层模型通信过程5.协议格式数据包封装以太网帧格式ARP数据报格式IP段格式UDP数据报格式TCP数据报格式…
linux网络编程一网络传输基础知识一、什么是协议二、使用步骤典型协议2.网络应用程序设计模式C/S模式B/S模式优缺点3.分层模型4.TCP/IP四层模型通信过程5.协议格式数据包封装以太网帧格式ARP数据报格式IP段格式UDP数据报格式TCP数据报格式6.TCP协议三次握手四次握手服务器客户端一、什么是协议
示例pandas 是基于NumPy 的一种工具该工具是为了解决数据分析任务而创建的。
二、使用步骤
从应用的角度出发协议可理解为“规则”是数据传输和数据的解释的规则. 假设A、B双方欲传输文件。规定 第一次传输文件名接收方接收到文件名应答OK给传输方 第二次发送文件的尺寸接收方接收到该数据再次应答一个OK 第三次传输文件内容。同样接收方接收数据完成后应答OK表示文件内容接收成功。 由此无论A、B之间传递何种文件都是通过三次数据传输来完成。A、B之间形成了一个最简单的数据传输规则。双方都按此规则发送、接收数据。A、B之间达成的这个相互遵守的规则即为协议。 这种仅在A、B之间被遵守的协议称之为原始协议。当此协议被更多的人采用不断的增加、改进、维护、完善。最终形成一个稳定的、完整的文件传输协议被广泛应用于各种文件传输过程中。该协议就成为一个标准协议。最早的ftp协议就是由此衍生而来。
典型协议
传输层 常见协议有TCP/UDP协议。 应用层 常见的协议有HTTP协议FTP协议。 网络层 常见协议有IP协议、ICMP协议、IGMP协议。 网络接口层 常见协议有ARP协议、RARP协议。 TCP传输控制协议Transmission Control Protocol是一种面向连接的、可靠的、基于字节流的传输层通信协议。 UDP用户数据报协议User Datagram Protocol是OSI参考模型中一种无连接的传输层协议提供面向事务的简单不可靠信息传送服务。 HTTP超文本传输协议Hyper Text Transfer Protocol是互联网上应用最为广泛的一种网络协议。 FTP文件传输协议File Transfer Protocol IP协议是因特网互联协议Internet Protocol ICMP协议是Internet控制报文协议Internet Control Message Protocol它是TCP/IP协议族的一个子协议用于在IP主机、路由器之间传递控制消息。 IGMP协议是 Internet 组管理协议Internet Group Management Protocol是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间。 ARP协议是正向地址解析协议Address Resolution Protocol通过已知的IP寻找对应主机的MAC地址。 RARP是反向地址转换协议通过MAC地址确定IP地址。
2.网络应用程序设计模式
C/S模式
传统的网络应用设计模式客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信
B/S模式
浏览器/服务器(server)模式。只需在一端部署服务器而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。
优缺点
C/S 优点1.协议灵活可自定义 2.缓存数据 缺点1.对用户的安全构成威胁 2.开发工作量较大调试困难 B/S 优点1.跨平台 2.无需缓存数据3.开发量小 缺点1.只能采用http协议
代码如下示例
3.分层模型 物理层主要定义物理设备标准如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流就是由1、0转化为电流强弱来进行传输到达目的地后再转化为1、0也就是我们常说的数模转换与模数转换。这一层的数据叫做比特。数据链路层定义了如何让格式化数据以帧为单位进行传输以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正以确保数据的可靠传输。如串口通信中使用到的115200、8、N、1网络层在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加而网络层正是管理这种连接的层。传输层定义了一些传输数据的协议和端口号WWW端口80等如TCP传输控制协议传输效率低可靠性强用于传输可靠性要求高数据量大的数据UDP用户数据报协议与TCP特性恰恰相反用于传输可靠性要求不高数据量小的数据如QQ聊天数据就是通过这种方式传输的。 主要是将从下层接收的数据进行分段和传输到达目的地址后再进行重组。常常把这一层数据叫做段。会话层通过传输层(端口号传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求设备之间需要互相认识可以是IP也可以是MAC或者是主机名。表示层可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如PC程序与另一台计算机进行通信其中一台计算机使用扩展二一十进制交换码(EBCDIC)而另一台则使用美国信息交换标准码ASCII来表示相同的字符。如有必要表示层会通过使用一种通格式来实现多种数据格式之间的转换。应用层是最靠近用户的OSI层。这一层为用户的应用程序例如电子邮件、文件传输和终端仿真提供网络服务。
4.TCP/IP四层模型 通信过程
两台计算机通过TCP/IP协议通讯的过程如下所示 上图对应两台计算机在同一网段中的情况如果两台计算机在不同的网段中那么数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器如下图所示
5.协议格式
数据包封装
传输层及其以下的机制由内核提供应用层由用户进程提供后面将介绍如何使用socket API编写应用程序应用程序对通讯数据的含义进行解释而传输层及其以下处理通讯的细节将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时每层协议都要加上一个数据首部header称为封装Encapsulation如下图所示 不同的协议层对数据包有不同的称谓在传输层叫做段segment在网络层叫做数据报datagram在链路层叫做帧frame。数据封装成帧后发到传输介质上到达目的主机后每层协议再剥掉相应的首部最后将应用层数据交给应用程序处理
以太网帧格式 其中的源地址和目的地址是指网卡的硬件地址也叫MAC地址长度是48位是在网卡出厂时固化的。可在shell中使用ifconfig命令查看“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。协议字段有三种值分别对应IP、ARP、RARP。帧尾是CRC校验码。 以太网帧中的数据长度规定最小46字节最大1500字节ARP和RARP数据包的长度不够46字节要在后面补填充位。最大值1500称为以太网的最大传输单元MTU不同的网络类型有不同的MTU如果一个数据包从以太网路由到拨号链路上数据包长度大于拨号链路的MTU则需要对数据包进行分片fragmentation。ifconfig命令输出中也有“MTU:1500”。注意MTU这个概念指数据帧中有效载荷的最大长度不包括帧头长度。
ARP数据报格式
在网络通讯时源主机的应用程序知道目的主机的IP地址和端口号却不知道目的主机的硬件地址而数据包首先是被网卡接收到再去处理上层协议的如果接收到的数据包的硬件地址与本机不符则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用。源主机发出ARP请求询问“IP地址是192.168.0.1的主机的硬件地址是多少”并将这个请求广播到本地网段以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播目的主机接收到广播的ARP请求发现其中的IP地址与本机相符则发送一个ARP应答数据包给源主机将自己的硬件地址填写在应答包中。 源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次对于链路层为以太网的情况是多余的但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型1为以太网协议类型指要转换的地址类型0x0800为IP地址后面两个地址长度对于以太网地址和IP地址分别为6和4字节op字段为1表示ARP请求op字段为2表示ARP应答 看一个具体的例子。 请求帧如下为了清晰在每行的前面加了字节计数每行16个字节 以太网首部14字节 0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06 ARP帧28字节 0000: 00 01 0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37 0020: 00 00 00 00 00 00 c0 a8 00 02 填充位18字节 0020: 00 77 31 d2 50 10 0030: fd 78 41 d3 00 00 00 00 00 00 00 00 以太网首部目的主机采用广播地址源主机的MAC地址是00:05:5d:61:58:a8上层协议类型0x0806表示ARP。 ARP帧硬件类型0x0001表示以太网协议类型0x0800表示IP协议硬件地址MAC地址长度为6协议地址IP地址长度为4op为0x0001表示请求目的主机的MAC地址源主机MAC地址为00:05:5d:61:58:a8源主机IP地址为c0 a8 00 37192.168.0.55目的主机MAC地址全0待填写目的主机IP地址为c0 a8 00 02192.168.0.2。 由于以太网规定最小数据长度为46字节ARP帧长度只有28字节因此有18字节填充位填充位的内容没有定义与具体实现相关。 应答帧如下 以太网首部 0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06 ARP帧 0000: 00 01 0010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02 0020: 00 05 5d 61 58 a8 c0 a8 00 37 填充位 0020: 00 77 31 d2 50 10 0030: fd 78 41 d3 00 00 00 00 00 00 00 00 以太网首部目的主机的MAC地址是00:05:5d:61:58:a8源主机的MAC地址是00:05:5d:a1:b8:40上层协议类型0x0806表示ARP。 ARP帧硬件类型0x0001表示以太网协议类型0x0800表示IP协议硬件地址MAC地址长度为6协议地址IP地址长度为4op为0x0002表示应答源主机MAC地址为00:05:5d:a1:b8:40源主机IP地址为c0 a8 00 02192.168.0.2目的主机MAC地址为00:05:5d:61:58:a8目的主机IP地址为c0 a8 00 37192.168.0.55。
IP段格式 IP数据报的首部长度和数据长度都是可变长的但总是4字节的整数倍。对于IPv44位版本字段是4。4位首部长度的数值是以4字节为单位的最小值为5也就是说首部长度最小是4x520字节也就是不带任何选项的IP首部4位能表示的最大值是15也就是说首部长度最大是60字节。8位TOS字段有3个位用来指定IP数据报的优先级目前已经废弃不用还有4个位表示可选的服务类型最小延迟、最大?吐量、最大可靠性、最小成本还有一个位总是0。总长度是整个数据报包括IP首部和IP层payload的字节数。每传一个IP数据报16位的标识加1可用于分片和重新组装数据报。3位标志和13位片偏移用于分片。TTLTime to live)是这样用的源主机为数据包设定一个生存时间比如64每过一个路由器就把该值减1如果减到0就表示路由已经太长了仍然找不到目的主机的网络就丢弃该包因此这个生存时间的单位不是秒而是跳hop。协议字段指示上层协议是TCP、UDP、ICMP还是IGMP。然后是校验和只校验IP首部数据的校验由更高层协议负责。IPv4的IP地址长度为32位。
UDP数据报格式 TCP数据报格式 与UDP协议一样也有源端口号和目的端口号通讯的双方由IP地址和端口号标识。32位序号、32位确认序号、窗口大小稍后详细解释。4位首部长度和IP协议头类似表示TCP协议头的长度以4字节为单位因此TCP协议头最长可以是4x1560字节如果没有选项字段TCP协议头最短20字节。URG、ACK、PSH、RST、SYN、FIN是六个控制位本节稍后将解释SYN、ACK、FIN、RST四个位其它位的解释从略。16位检验和将TCP协议头和数据都计算在内。紧急指针和各种选项的解释从略。
6.TCP协议
三次握手 建立连接三次握手的过程
客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的段1。 客户端发出段1SYN位表示连接请求。序号是1000这个序号在网络通讯中用作临时的地址每发一个数据字节这个序号要加1这样在接收端可以根据序号排出数据包的正确顺序也可以发现丢包的情况另外规定SYN位和FIN位也要占一个序号这次虽然没发数据但是由于发了SYN位因此下次再发送应该用序号1001。mss表示最大段尺寸如果一个段太大封装成帧后超过了链路层的最大帧长度就必须在IP层分片为了避免这种情况客户端声明自己的最大段尺寸建议服务器端发来的段不要超过这个长度。服务器端回应客户端是三次握手中的第2个报文段同时带ACK标志和SYN标志。它表示对刚才客户端SYN的回应同时又发送SYN给客户端询问客户端是否准备好进行数据通讯。 服务器发出段2也带有SYN位同时置ACK位表示确认确认序号是1001表示“我接收到序号1000及其以前所有的段请你下次发送序号为1001的段”也就是应答了客户端的连接请求同时也给客户端发出一个连接请求同时声明最大尺寸为1024。客户必须再次回应服务器端一个ACK报文这是报文段3。 客户端发出段3对服务器的连接请求进行应答确认序号是8001。在这个过程中客户端和服务器分别给对方发了连接请求也应答了对方的连接请求其中服务器的请求和应答在一个段中发出因此一共有三个段用于建立连接称为“三方握手three-way-handshake”。在建立连接的同时双方协商了一些信息例如双方发送序号的初始值、最大段尺寸等。
四次握手
由于TCP连接是全双工的因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭而另一方执行被动关闭。
客户端发出段7FIN位表示关闭连接的请求。服务器发出段8应答客户端的关闭连接请求。服务器发出段9其中也包含FIN位向客户端发送关闭连接请求。客户端发出段10应答服务器的关闭连接请求。
服务器
#include sys/types.h
#include sys/socket.h
#include stdlib.h
#include unistd.h
#include sys/stat.h
#include netinet/in.h
#include arpa/inet.h
#include ctype.h
#include stdio.h
#include memory.h#define SERV_PORT 6666
#define SERV_IP 127.0.0.1int main()
{int sid,ret,cid,len;struct sockaddr_in addr,clie_addr;char buf[BUFSIZ] {0};char clie_IP[BUFSIZ];socklen_t clie_len,clie_ip_len;//服务器创建套接字sidsocket(AF_INET, SOCK_STREAM,0);if (sid -1){perror(server error:);exit(1);}bzero(addr,sizeof(addr));addr.sin_family AF_INET;addr.sin_port htons(SERV_PORT);addr.sin_addr.s_addr htonl( INADDR_ANY);//绑定retbind(sid,(struct sockaddr*)addr,sizeof(addr));if (ret -1){perror(bind error:);exit(1);}retlisten(sid,30);if (ret -1){perror(listen error:);exit(1);}clie_len sizeof(clie_addr);cidaccept(sid, (struct sockaddr*)clie_addr, clie_printf(client IP:%s,client port:%d\n,inet_ntop(AF_INET,clie_addr.sin_addr.s_addr,cli, ntohs(clie_addr.sin_port));while (1){//读取客户端信息len read(cid, buf, sizeof(buf));if (len 0){perror(read error);exit(1);}write(STDOUT_FILENO, buf, sizeof(buf));for (int i 0; i len; i){buf[i] toupper(buf[i]);}write(cid, buf, sizeof(buf));memset(buf,0,sizeof(buf));}close(sid);close(cid);return 0;
}客户端
#include sys/types.h
#include sys/socket.h
#include stdlib.h
#include unistd.h
#include sys/stat.h
#include netinet/in.h
#include arpa/inet.h
#include ctype.h
#include stdio.h
#include memory.h#define CLIE_PORT 6666
#define CLIE_IP 118.178.192.222int main()
{char buf[BUFSIZ] {0};struct in_addr s; // IPv4地址结构体int cfd,ret,n;struct sockaddr_in addr;//客服端创建套接字cfd socket(AF_INET,SOCK_STREAM,0);if (cfd -1){perror(client error:);exit(1);}memset(addr, 0, sizeof(addr));addr.sin_family AF_INET;addr.sin_port htons(CLIE_PORT);inet_pton(AF_INET, CLIE_IP,addr.sin_addr.s_addr);ret connect(cfd,(struct sockaddr *)addr,sizeof(addr));if (ret 0){perror(connect error:);exit(1);}while (1){//从终端写入fgets(buf,sizeof(buf),stdin);write(cfd,buf,strlen(buf));nread(cfd, buf, sizeof(buf));write(STDOUT_FILENO, buf, n);memset(buf, 0, sizeof(buf));}close(cfd);return 0;
}