您好,欢迎访问三七文档
1.第7层应用层:常见的协议有:HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等第6层表示层:为不同的客户端提供数据和信息的语法转换内码,使系统能解读成正确的数据。同时,也能提供压缩解压、加密解密。第5层会话层:会话层用于为通信双方制定通信方式,并创建、注销会话(双方通信)第4层传输层:用于控制数据流量,并且进行调试及错误处理,以确保通信顺利。而传送端的传输层会为分组加上序号,方便接收端把分组重组为有用的数据或文件。第3层网络层:网络层的作用是决定如何将发送方的数据传到接收方。该层通过考虑网络拥塞程度、服务质量、发送优先权、每次路由的耗费来决定节点X到节点Y的最佳路径。我们熟知的路由器就工作在这一层,通过不断的接收与传送数据使得网络变得相互联通。第2层数据链路层:首先数据链路层的功能在于管理第一层的比特数据,并且将正确的数据传送到没有传输错误的路线中。创建还有辨认数据开始以及退出的位置同时予以标记。另外,就是处理由数据受损、丢失甚至重复传输错误的问题,使后续的层级不会受到影响,所以它运行数据的调试、重传或修正,还有决定设备何时进行传输。设备有:Bridge桥接器switch交换器第1层物理层:物理层定义了所有电子及物理设备的规范。其中特别定义了设备与物理媒介之间的关系,这包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机适配器(在SAN中使用的主机适配器)以及其他的设备的设计定义。因为物理层传送的是原始的比特数据流,即设计的目的是为了保证当发送时的信号为二进制“1”时,对方接收到的也是二进制“1”而不是二进制“0”。因而就需要定义哪个设备有几个针脚,其中哪个针脚发送的多少电压代表二进制“1”或二进制“0”,还有例如一个bit需要持续几微秒,传输信号是否在双向上同时进行,最初的连接如何创建和最终如何终止等问题。2.TCP/IP协议簇:应用层:telnet,ftp传输层:TCP/UDP网络层:ICMP,IGMP,IPv4,IPv6网络接口层:ARP,RARP,MPLS3,ARP:用于获得同一物理网络中的硬件主机地址。MPLS:多协议标签协议,是很有发展前景的下一代网络协议。IP:负责在主机和网络之间寻址和路由数据包。ICMP:用于发送报告有关数据包的传送错误的协议。IGMP:被IP主机用来向本地多路广播路由器报告主机组成员的协议。TCP:为应用程序提供可靠的通信连接。适合于一次传输大批数据的情况。并适用于要求得到响应的应用程序。UDP:提供了无连接通信,且不对传送包进行可靠的保证。适合于一次传输少量数据,Linux线程的实现由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放。正如进程之间可以用wait()系统调用来同步终止并释放资源一样,线程之间也有类似机制,那就是pthread_join()函数。在进行多线程编程时,常出现undefinedreferenceto‘pthread_create’的错误,解决办法是:加上-lpthread选项几个常用的数据结构4、定义:所谓三次握手,是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。目的:三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换TCP窗口大小信息.在socket编程中,客户端执行connect()时,将触发三次握手。5、第一次握手:客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号字段里。第三次握手.客户端再次发送确认包(ACK)SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+16、SYN攻击在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-openconnect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.Syn攻击就是攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。Syn攻击是一个典型的DDOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击netstat-n-pTCP|grepSYN_RECV7、TCP四次挥手TCP的连接的拆除需要发送四个包,因此称为四次挥手。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作8、断开一个连接,为什么要四次挥手由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。9、(1)socket:该函数用于建立一个socket连接,可指定socket类型等信息。在建立了socket连接之后,可对socketadd或sockaddr_in进行初始化,以保存所建立的socket信息。(2)Bind:该函数是用于将本地IP地址绑定端口号的,若绑定其他地址则不能成功。(3)connect:该函数在TCP中是用于bind的之后的client端,用于与服务器端建立连接(4)Send和recv:这两个函数用于接收和发送数据,可以用在TCP中,也可以用在UDP中。当用在UDP时,可以在connect函数建立连接之后再用。(5)sendto和recvfrom:这两个函数的作用与send和recv函数类型,也可以用在TCP和UDP中。当用在TCP时,后面的几个与地址有关参数不起作用,函数作用等同于send和recv;当用在UDP时,可以用在之前没有使用connect的情况时,这两个函数可以自动寻找制定地址并进行连接。10.socket流程图11、intsetsockopt(intsockfd,intlevel,intoptname,constvoid*optval,socklen_toptlen);sockfd:标识一个套接口的描述字。level:选项定义的层次;支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。optname:需设置的选项。optval:指针,指向存放选项值的缓冲区。optlen:optval缓冲区长度。Gethostname函数原型Hostent结构Hostent各字段描述char*h_name表示的是主机的规范名。例如。char**h_aliases表示的是主机的别名。地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6)inth_length表示的是主机ip地址的长度int**h_addr_list表示的是主机的ip地址,注意,这个是以网络字节序存储的一、实验2:gethostbyname的使用intmain(intargc,char**argv){if(argc!=2){printf(Usageis%shostname\n,argv[0]);return-1;}structhostent*server=gethostbyname(argv[1]);/函数原型structsockaddr_inaddr;addr.sin_addr.s_addr=*(int*)(server-h_addr);printf(h_name%s\n,server-h_name);printf(h_alias%s\n,server-h_aliases[0]);printf(h_haddr0x%x\n,*(int*)server-h_addr);printf(h_haddraddr%s\n,inet_ntoa(addr.sin_addr));return0;}二、UDP多线程实验Udp_server:intmain(intargc,char**argv){intsockfd,len,opt=1;structsockaddr_incliaddr;uint8_tbuffer[BUFFER_SIZE];intret=RET_OK;memset(buffer,0xff,sizeof(buffer));if((sockfd=socket(AF_INET,SOCK_DGRAM,0))0){perror(ERRORopeningsocket);returnRET_ERR;}if((ret=setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)))0){perror(ERRORsetsockopt);gotofailed;}memset(&cliaddr,0,sizeof(cliaddr));cliaddr.sin_family=AF_INET;cliaddr.sin_addr.s_addr=INADDR_ANY;cliaddr.sin_port=htons(ECHO_PORT);if((ret=bind(sockfd,(structsockaddr*)&cliaddr,sizeof(cliaddr)))0){perror(ERRORonbinding);gotofailed;}do{len=sizeof(cliaddr);if((ret=recvfrom(sockfd,buffer,sizeof(buffer),0,(structsockaddr*)&cliaddr,&len))0){printf(Recvfrom%s\r\n,inet_ntoa(cliaddr.sin_addr));ret=sendto(sockfd,buffer,ret,0,(structsockaddr*)&cliaddr,len);}}while(ret=0);failed:close(sockfd);return0;}Udp_client:intmain(intargc,char*argv[]){intsockfd,ret=RET_OK;structsockaddr_inservaddr;structhostent*server;structin_addrap;charbuffer[BUFFER_SIZE];memset(buffer,0xff,sizeof(buffer));if(argc2){fprintf(stderr,usage%shostname\n,argv[0]);returnRET_ERR;}if((server=gethostbyname(argv[1]))==NULL){herror(gethostbyname.);returnRET_ERR;}else{SYS_INFO_PRINT(theserveripis0x%x\n,*(U32*)(server-h_addr));}if((sockfd=socket(AF_INET,SOCK_DGRAM,0))0){perror(ERRORopeningsocket);returnRET_ERR;}memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=*(uint32_t*)serv
本文标题:嵌入式网络协议攻略
链接地址:https://www.777doc.com/doc-2517884 .html