INTER-NET就是在网络之间的传输共享资源,它也就是跨计算机的传输,那么这种传输需要有什么样的约束,才能确保在网络之间传输,于是就有了网络传输协议的概念。
只要大家遵循这种约定,抽象的理解也就是统一了接口的的含义,只要使用者遵循了这种约定,也就可以像之前一个计算机中两个进程之间的传输信息共享资源。
网络的特点体现了网络进程过程中的分层特点,每一层约定特定的协议进行传输,
网络的体系结构是指网络的层次结构和每层所使用的协议的集合
在网络体系结构中有两个重要的体系结构:OSI于TCP/IP
网络的互联促成了TCP/IP协议的产生
现在通用的一般是TCP/IP体系结构:
1)传输层遵循的是TCP/UDP协议
TCP协议属于传输层的协议其中也包括UDP和SCTP的协议
其中传输层的协议是来保证文件传输的可靠性(数据无丢失,数据无误,数据无乱序,数据无重复到达),
而TCP协议就是其中面向连接的传输层协议,使用范围有:适用于对传输性能要求高,以及大文件传输的通信;在需要可靠性通信的场合;QQ等即是通讯通常采用TCP协议
UDP协议的特点:用户数据报的协议,是不可靠的无连接的协议,在数据发送前不要连接,从而提高了数据的传输效率(为什么会导致数据的可靠性降低:是因为UDP传输在文件的传输过程中没有备份文本的副本,在没有确定文件已经正确传输到达之前已经丢弃了数据的信息)
2)网络层遵循的是IP/ICMP/GMP协议
IP地址是在Internet中标识主机的,一般来说一个主机可以用唯一的IP地址来标识(另外无线网也有一个IP地址)从而可以在网络之间约定协议进行传输,IP地址一般有多种,这里主要的是IPV4,它遵循的IP协议的地址族是AF_INET,一般IP地址分为网络部分和主机部分,当信息通过IP传到主机可以通过掩码来分离网络部分和端口号,
端口号表示一台主机接收的数据报应该转交给那个进程来处理。 一个数据使用不同的传输协议,那么它的TCP和UDP传输端口号是独立的。
3)网络接口与物理层(数据链路层(ARP协议是的物理传输是以以太网数据传输的))
socket的重要性
1)socket是一种编程接口,原始被人们称为套接口后来演变为套接字,它是一种特殊的文件描述符,并不局限于TCP/IP协议。
普通的IO操作过程:
打开文件-》读写操作-》关闭文件
TCP/IP协议被集成到操作系统内核中,从而引入了新的“IO操作”,在OSI体系结构中socket位于会话层和传输层
网络通信的一般编程(端对端循环通信模式):
1)服务器端:
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLEN 100 typedef struct sockaddr SA; int main () { int nr; int listenfd,connfd; char buf[MAXLEN]; struct sockaddr_in servaddr,cliaddr; socklen_t clilen; if ((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0){ perror("socket"); exit(-1); } bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; servaddr.sin_port = htons(8888); if (bind(listenfd,(SA*)&servaddr,sizeof(servaddr)) < 0){ perror("bind"); exit(-1); } listen(listenfd,5); while(1){ clilen = sizeof(cliaddr); connfd = accept(listenfd,(SA*)&cliaddr,&clilen); printf("connection from %s ,prot %d\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port)); memset(buf,0,sizeof(buf)); while((nr = recv(connfd,buf,MAXLEN,0)) >0){ printf("this is server read :%s\n",buf); send(connfd,buf,sizeof(buf),0); } close(connfd); } close(listenfd); return 0; }
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLEN 100 typedef struct sockaddr SA; int main (int argc,char *argv[]) { int sockfd,nbyte; socklen_t clilen; struct sockaddr_in servaddr,cliaddr; char buf[MAXLEN]; if((sockfd = socket(AF_INET,SOCK_STREAM,0)) <0){ perror("sockfd"); exit(-1); } memset(&servaddr,0x00,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; servaddr.sin_port = htons(8888); if (connect(sockfd,(SA*)&servaddr,sizeof(servaddr))< 0){ perror("conncet"); exit(-1); } do { fgets(buf,MAXLEN,stdin); write(sockfd,buf,MAXLEN); memset(buf,0,sizeof(buf)); read(sockfd,buf,MAXLEN); printf("this is client recv read :%s\n",buf); }while(strncmp(buf,"quit",4) != 0); close(sockfd); return 0; }