【UNIX】認識iner-net網際網以及網絡編程

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;
}

2)客戶端:

#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;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章