所有系统I/O分为两个阶段:等待就绪,操作。读函数分为等待系统可读和真正的读。写函数分为等待网卡可写和真正的写。
数据如何发送?
1.应用程序将数据写入进程的内存地址空间。
2.应用程序通过系统函数接口向内核发出系统调用,系统内核将用户态内存数据复制到内核缓冲区。
3.内核通知网卡控制器,网卡控制器将内核缓冲区数据复制到网卡缓冲区。
4.网卡使用内部特定物理装置将网卡缓冲区中数据转换成电信号或光信号然后发送到线路中。
一个用户向服务器连续进行1000次请求的过程中,任何时刻服务器的网卡接收缓冲区中只有来自该用户的一个请求。而100个用户同时向服务器分别进行10次请求的过程中,服务器网卡接收缓冲区最多有100个等待处理的请求。
如果没有猜错,一台服务器接收请求的能力取决于网卡的性能。网卡的接收缓冲区的大小决定了最多能接收多少请求,当然也跟请求中数据的大小有关。超出了网卡接收缓冲区的范围一定会出现网络阻塞,但程序处理请求的线程过多也会导致系统阻塞
HTTP超文本传输协议和socket接口:
http请求指采用http协议的请求,http协议指应用层对请求传递的数据的格式定义,请求中应该包含哪些字段。比如referer,user-agent等
首先HTTP不是连接,http只是一个基于可靠连接的应用层的超文本传输协议(只是应用层对数据形式的一种格式规定而已,使用socket接口可以实现http协议请求,只要java的socket发送的数据格式符合http协议要求即可,当然socket还可以实现ftp)。实现可靠传输的网络都可以使用HTTP协议,不只是实现TCP可靠连接的网络才能用,当然使用TCP可靠连接来实现可靠连接的网络比较多。
而socket也不是连接,socket接口是TCP/IP协议组排除应用层后的封装调用(不封装应用层使用户选择具体应用层的协议时更具灵活性,不然用户没得选了),是面向程序员的不包含应用层的TCP/IP协议组的实现。调用socket接口可实现TCP/IP体系的网络互连功能。因此使用socket接口调用TCP/IP协议实现联通性时既可以使用TCP可靠连接,也可以使用UDP不可靠连接。直接在程序中用IO流输入输出即可实现数据传输,具体怎么封装数据可自己选择某个应用层协议或自定义来实现。
java中socket的核心API有Socket类(传输层默认使用TCP可靠连接),ServerSocket类(服务端的Socket),DataGramSocket类(传输层使用UDP协议)。
传输层的连接协议目前知道的只有TCP可靠传输和UDP不可靠传输
分层:应用层,传输层,网络层
数据链路层,物理层。
常见应用层协议:HTTP,FTP文件传输协议,SMPP短信协议,telnet远程登录控制协议,IM即时通讯的一些应用层协议
实现超文本传输首先要和服务器建立可靠连接,通常使用TCP连接。TCP连接需要三次握手,当三次握手的前两次完成后,浏览器就把HTTP请求报文作为TCP连接第三次握手的报文发给万维网服务器。
许多情况下我们需要使用信道这个概念,信道和电路不同,信道用来表示向某一个方向传送信息的媒体。因此,一条通信电路往往包含一条发送信道和一条接收信道。
从通信的交互方式来看可将信道分为:
单向通信:又称单工通信,即只能由一个方向的通信而没有反向的交互。如无线电有线电广播,电视广播。
双向交替通信:又称半双工通信。通信双方都可以发送信息,但不能双方同时发送同时接收。一方发送一方接收,过一段时间再反过来。
双向同时通信:又称全双工通信,通信双方可以同时发送和接收消息。
单工通信只需要一条信道,双工通信需要两条信道(两个方向)。
信道的概念类似于流的概念,只不过输入输出流是针对程序这个输入输出的点,而信道是针对通信线路这条线。
传输层的UDP协议是无连接的,谈不上长链接还是短连接。而TCP则基于连接提供全双工通信(HTTP的限制导致其使用的TCP连接只使用了半双工通信的功能)。
TCP三次握手:A发起建立连接请求,B收到后如果同意建立连接则向A发出确认,A再次向B进行确认(避免A第一次的请求延时或B返回的确认丢失或延时后A不想连了B却以为建立了和A的连接一直等待),则连接建立。三次握手只是建立建立,真正的传输数据还没开始(http确实在第三次握手时就开始发送数据报文了)。
TCP四次握手:A发起释放连接请求,B回复A进行确认(确认后A不能再向B发送数据,A到B方向的连接关闭)。然后A等待B发起释放连接请求,A回复B进行确认(确认后B到A方向的连接被关闭)。至此连接才算完全关闭。