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