TCP/IP是一个四层的体系结构,它包含应用层(各种应用层协议,例如TELNET,FTP,SMTP,POP3,HTTP等),运输层(TCP和UDP),网际层(IP)和网络接口层。不过从实质上,TCP/IP只有最上面的三层,因为最下面的网络接口层和一般的通信链路在功能上没有多大的差别。
应用层
HTTP有两种报文:
(1)请求报文---从客户端向服务器发送请求报文
(2)响应报文---从服务器到客户端的回答
报文都是由三部分组成:开始行(区分请求报文或是响应报文,分贝为请求行和状态行)、首部行、实体主体
请求报文的一些方法
OPTION:请求一些选项信息
GET:请求读取由URL所标识的信息
POST:给服务器添加信息
HEAD:请求读取由URL所标识的信息的首部
PUT:在指明的URL下存储一个文档
DELETE:删除指明URL所标识的资源
TRACE:用来进行环回测试的报文
CONNECT:用于代理服务器
GET请求和POST请求的区别:
1. GET请求的接口会包含参数部分,参数会作为网址的一部分,服务器地址与参数之间通过 ? 来间隔。POST请求会将服务器地址与参数分开,请求接口中只有服务器地址,而参数会作为请求的一部分,提交后台服务器。
2. GET请求参数会出现在接口中,不安全。而POST请求相对安全。
3.虽然GET请求和POST请求都可以用来请求和提交数据,但是一般的GET多用于从后台请求数据,POST多用于向后台提交数据。
响应报文:
每一个请求报文发出后都会收到一个响应报文,响应报文的第一行就是状态码。
状态吗都是三位数字,分为五大类,33种。
1xx表示通知信息的,如请求收到了活正在处理
2xx表示成功,如接受或知道了
3xx表示重定向,如完成请求还必须进行进一步的行动
4xx表示客户端错误,如请求中的语法错误或不能完成
5xx服务器错误,服务器失效无法完成请求
短连接
连接->传输数据->关闭连接
HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。
长连接
连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
http的长连接
HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP 1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。
什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
传输层
socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
socket的表示方法
socket = (IP地址:端口号) 示例:192.3.4.5:80
socket通信示例
主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接,而建立 Socket 连接必须需要底层 TCP/IP 协议来建立 TCP 连接。建立 TCP 连接需要底层 IP 协议来寻址网络中的主机。我们知道网络层使用的 IP 协议可以帮助我们根据 IP 地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过 TCP 或 UPD 的地址也就是端口号来指定。这样就可以通过一个 Socket 实例唯一代表一个主机上的一个应用程序的通信链路了。
无连接的UDP
特点:无连接;尽最大努力交付;面向报文无拥塞控制;支持一对一,一对多,多对一和多对对;首部开销小
面向连接的TCP
特点:面向连接,点对点(一对一),可靠,全双工通信,面向字节流
SYN:同步,SYN置为1表示这是一个连接请求活连接接受报文
FIN:终止,FIN置为1表明此报文段的发送方的数据已经发送完毕,并要求释放运输链接
ACK:确认,当ACK置为1时确认字段才有效。
seq:序号,本段报文段所发送的数据的第一个字节的序号。
ack:确认号,期望收到对方下一个报文段的第一个数据字节的序号。
例:ack = N 表明:到序号N-1为止的所有数据都已经正确收到。
三次握手:
四次挥手:
网络层
IP
建立通信链路
当客户端要与服务端通信,客户端首先要创建一个 Socket 实例,操作系统将为这个 Socket 实例分配一个没有被使用的本地端口号,并创建一个包含本地和远程地址和端口号的套接字数据结构,这个数据结构将一直保存在系统中直到这个连接关闭。在创建 Socket 实例的构造函数正确返回之前,将要进行 TCP 的三次握手协议,TCP 握手协议完成后,Socket 实例对象将创建完成,否则将抛出 IOException 错误。
与之对应的服务端将创建一个 ServerSocket 实例,ServerSocket 创建比较简单只要指定的端口号没有被占用,一般实例创建都会成功,同时操作系统也会为 ServerSocket 实例创建一个底层数据结构,这个数据结构中包含指定监听的端口号和包含监听地址的通配符,通常情况下都是“*”即监听所有地址。之后当调用 accept() 方法时,将进入阻塞状态,等待客户端的请求。当一个新的请求到来时,将为这个连接创建一个新的套接字数据结构,该套接字数据的信息包含的地址和端口信息正是请求源地址和端口。这个新创建的数据结构将会关联到 ServerSocket 实例的一个未完成的连接数据结构列表中,注意这时服务端与之对应的 Socket 实例并没有完成创建,而要等到与客户端的三次握手完成后,这个服务端的 Socket 实例才会返回,并将这个 Socket 实例对应的数据结构从未完成列表中移到已完成列表中。所以 ServerSocket 所关联的列表中每个数据结构,都代表与一个客户端的建立的 TCP 连接。