学习笔记11
一、概述:
这一章主要介绍了TCP/IP协议,首先是讲述了TCP/IP协议以及其应用,包括TCP/IP栈、DNS、主机名、路由器等等,在计算机操作系统中,TCP和UDP会遇到同时为多个应用程序提供并发服务的问题,多个TCP连接或者多个应用程序需要借助相同的TCP协议端口传输数据,通过借助TCP、UDP套接字的规则来演示网络编程。之后是讲述了web编程,展示了如何借助linux的系统来支持web,cgi,php编程并且还进行了演示,讲解了借助cgi和php创建动态web的页面。
二:主要内容:
(一)TCP/IP基础知识
1.ISO/OSI基础模型
各层具体意义:
物理层:定义了所有电子物理设备的使用规则,给向上层的传输提供了物理介质,例如现实中使用的网卡等等即属于此层。
数据链路层:对来自物理层的数据流信息封装成帧,实现无差错的数据传输,进行可靠的数据传输服务,实际中使用的例如交换器属于此层。
网络层:将各个子网的数据进行选择分配重组,以数据包的形式传输。现实中的路由器就属于此层。
传输层: 检测上一层中路由器丢失的包数据,再产生一个重传请求,并将无序的包排序。
会话层:会话的建立、终止以及管理均由该层控制。
应用层:和应用程序进行沟通,再进行修改完善达到用户要求。
四层模型:
四层模型实例:
2.客户-服务器模型
大部分网络应用程序在编写时都假设一端是客户,另一端是服务器,其目的就是为了让服务器为客户提供一些特定的服务。
可将这种服务分为两种类型,重复型和并发型
重复型服务器可通过以下步骤进行交互:
①等待一个客户请求的到来
②处理客户请求
③发送响应给发送请求的客户
④返回1
注意:重复型服务器主要问题都在②,在此状态下,它不能给其他服务器提供服务
并发型服务器:
①等待一个客户请求的到来
②启动一个心得服务器来处理这个客户的请求,在此期间可能生成一个新的进程
③返回1
一般来说,TCP服务器是并发的,而UDP服务器是重复的。
(二)网络编程:
对于Linux而言,socket操作与文件操作没有区别,socket被认为是文件的一种,因此在网络数据传输的过程中可以使用文件I/O的相关函数.
①打开文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *path,int flag);
成功时返回文件描述符,失败返回-1
②关闭文件
#include <unistd.h>
int close(int fd);
成功时返回0,失败返回-1
③将数据写入文件
write函数用于向文件输出数据,linux系统中不区分文件与套接字
#include <unistd.h>
ssize_t wirte(int fd,const void *buf,size_t nbytes);
成功时返回写入的字节数,失败返回-1
④读取文件中的数据
#include <unistd.h>
ssize_t read(int fd,void *buf,size_t nbytes);
成功时返回接收的字节数(但遇到文件结尾则返回0),失败时返回-1
套接字的域(又称协议族)
域指定套接字通信中使用的网络介质.最常见的套接字域是AF_INET,它指的是Internet网络.其底层的协议–网际协议(IP)只有一个地址族,它使用IP地址来指定网络中的计算机
四:代码实践
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch='A';
sockfd=socket(AF_UNIX,SOCK_STREAM,0);
address.sun_family=AF_UNIX;
strcpy(address.sun_path,"server_socket");
len=sizeof(address);
result=connect(sockfd,(struct sockaddr *)&address,len);
if(result == -1)
{
perror("oops:client1");
exit(1);
}
//现在就可以通过sockfd进行读写操作了
write(sockfd,&ch,1);
read(sockfd,&ch,1);
printf("char from server = %c\n",ch);
close(sockfd);
close(sockfd);
exit(0);
}