网络连接相关基础知识笔记
一.常说的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,