网络连接相关基础知识笔记

一.常说的TCP/IP的含义

TCP/IP协议簇并不仅仅指TCP协议和IP协议,实际它包括了一系列协议组成的集合,如:TCP,IP,UDP,FTP,SMTP,DNS,ARP,PPP等

TCP与UDP协议都属于传输层协议,但有很大不同,TCP是面向连接的协议,提供的是可靠的数据流服务,TCP采用"带重传的肯定确认"机制来实现传输的可靠性,实现了一种"虚电路",因为从物理上来说,并不是真正在两台主机间建立了连接,这种连接只是存在于逻辑上的。最大的开销出现在通信前建立连接和事后释放连接。

而UDP提供的是不可靠的或者说无连接的通信。对应的,UDP协议的开销比TCP的开销要小。

1.TCP协议属于传输层协议,三次握手建立连接,四次握手释放连接。

2.HTTP协议是应用层协议,基于TCP协议,通信始终采用的是客户端请求,服务器响应的模型。

 

二.理解socket编程

socket是一个编程接口,最初用于进程间通信,后来扩展至支持Unix中的TCP/IP通信。在Unix中everything is a file,所以通过socket()函数返回的socket句柄就是一个文件描述符。

socket对象可以理解为通信端点的抽象表示,包括五部分内容:使用的通信协议(可以是TCP,也可是UDP),本地主机IP,本地端口,远程主机IP,远程主机端口。

服务器一直处于监听状态,客户端发送消息,服务器创建一个线程来服务此用户(即服务这个socket,将此次获得的这个socket作为参数传入线程,线程可以从socket取出数据,操作等等...),与此同时监听线程继续监听端口。

具体编程:

C语言:

1.建立一个socket

int socket(int family, int type, int protocol);  //family是地址族,type是流式/数据报/原生,protocol一般设为0

这一步实际意味着为一个Socket数据结构分配内存空间

2.配置socket,即设置本地/远程主机地址和端口

无论哪种类型的socket,服务器端都用 int bind(int sockfd,struct sockaddr *my_addr, int addrlen) 函数配置

无连接客户端也用bind函数配置,对于有连接socket的配置和建立连接两个功能的用一个connect()函数实现

3.int connect(int sockfd, struct sockaddr *serv_addr,int addrlen);

只有面向连接的客户端才需要调用这个函数,配置socket并发起同服务端的连接。

4.服务端不主动发起连接,在socket配置好以后,只需调用 int listen(int sockfd, int backlog)函数监听端口,等待客户端的请求。

listen方法让socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到来的请求保存在该队列中。backlog参数指定等待队列中允许保存的最大请求数。大多数系统缺省值为20。如果一个服务请求到来时,该输入队列已满,该socket将拒绝连接请求,客户端将收到错误信息。

5.int accept(int sockfd, void *addr, int *addrlen)  在监听开启以后,服务端调用这个方法返回一个socket,返回的这个socket与发起请求的特定主机信息联系起来。而原来的ServerSocket则继续监听。

三.小结:

Socket是网络编程这块中最基础的东西,它将网络IO的复杂性进行了封装,通过调用Socket接口,我们可以在网络中传输数据。平常提到Socket,我们想到相关的就是服务器,客户端,连接,TCP,UDP,字节流这些东西。

虽然现在客户端与服务器可以通过Socket互相发送任意字符或字节,但是如果我们要看见更丰富更标准的东西,比如html网页,图片,视频,简而言之,就是超越文本的资源(引出了HTTP协议),又该如何,当然我们可以自己按标准来组织,解析字节流中的数据,但是自己的实现方式可能不是最优的,甚至出错,所以还是需要标准,需要协议,这些东西就是为了规范通用,提升效率而设计的,当然要使用!

首先看HTTP协议,超文本传输协议规定了浏览器与服务器怎样传输文档,有了它,我们就不会随心所欲的编写通信字符串了。客户端向服务器发送的文档,服务器按照HTTP协议来读,一下就能读懂,反过来也是。

http基本的模型就是请求——响应模型,接下来就需要服务器具备可以解析这份遵守HTTP协议文档的能力,这实现起来自然不难,所以Web容器(如tomcat)支持http,以java为例,实际就是Servlet中httpservelt的实现,具体步骤就是,服务器从socket的字节输入流中根据http协议解析出请求信息,服务器创建httpservletrequest对象和httpservletresponse,将解析出的请求信息封装在这个请求对象里——进入servlet容器处理部分,程序员从httpservletrequest中取得信息操作,最后程序员将响应信息放到httpservletresponse里——服务器提取httpservletresponse中的信息,根据Http协议翻译成字节或者字符,写入socket的输出流,接下来就是socket负责的通信传输的事了。

可以这样理解协议,协议就是一系列带有标准格式的字符串

从Web容器中可以独立给程序员的模型接口就是Servlet,Servlet可以看作是Web容器运行的一部分逻辑,request与response归根结底对应的是Socket中的字节输入流和字节输出流。所以,Web容器的核心是Socket,

 

 

 

 

 

posted @ 2014-05-16 17:18  幽灵漫步  阅读(454)  评论(0编辑  收藏  举报