前言
一道经典的面试题,http协议和tcp协议的区别和联系,想必大家都被问过,三次握手四次挥手?今天想要从基础开始深刻地理解并回答这个题目。
计算机网络
大学里有一门课,考研408的科目之一,计算机网络。
计算机网络用我自己的话来说就是很多计算机用网络连接起来,基于此,接入网络的计算机就必须使用TCP/IP协议。
有一个经典的网络模型图
- OSI定义的七层网络标准模型
- TCP/IP 模型并不和OSI一一对应,只是大致对应
- IP协议 负责发数据包,不负责顺序和正确
- TCP协议 是建立在IP协议之上的传输控制协议,支持可靠传输和双向通信,是通过接受确认和超时重传等机制实现可靠传输的
- HTTP协议 是一种超文本传输协议,建立在TCP协议之上的连接协议
- UDP协议 是一种数据报文协议,是无连接协议,不保证可靠传输
socket
socket就是一个信使,应用程序用它发送和接收数据。就不说概念了,直接上代码。
建立一个socket连接
Socket socket = new Socket(host, port);
//如果主机不可访问就会阻塞,所以一定要设置超时
socket.setSoTimeout(10000); //单位为毫秒
host主机、port端口号
连接建立后,就可以获取输入流
InputStream is = socket.getInputStream();
通常情况socket连接就是TCP连接,一旦建立,通信双方就可以互发信息。HTTP协议采用的是请求-响应的方式,不仅需要先建立连接,还需要发送请求后,才能回复数据。
简单实现一个收发socket连接
ServerSocket serverSocket = new ServerSocket(port, ip)
serverSocket.accept();
// 接收请求数据
socket.getInputStream();
// 返回数据给请求方
out = socket.getOutputStream()
out.print(xxx)
out.flush();;
// 关闭连接
socket.close()
HTTP
http请求消息由请求行、请求头、请求体等构成
- 请求行 GET /index.html HTTP/1.1
- 请求头 键值对保存的元数据,包含HOST、User-Agent、Content-Type、content-Length、Accept
- 请求体 参数
http响应消息由状态行、响应头、响应体等构成
- 状态行 HTTP/1.1 200 ok
- 响应头 键值对保存的元数据,包含Content-Type、Content-Length等
- 正文
回答
现在回到面试题 TCP(传输控制协议)
- 层次:属于传输层
- 功能:可靠传输,有序
- 面向连接,传输前需要建立连接
HTTP(超文本传输协议)
- 层次:属于应用层
- 功能:定义好了请求和响应格式,支持不同的方法进行不同的操作
- 基于请求/响应,每个请求都是独立的,不保存会话
关系:HTTP基于TCP连接,HTTP发送请求是因为TCP提供了可靠的字节流传输,保证了数据的完整和顺序,TCP关注的是网络中数据的可靠传输,HTTP关注的是如何在此基础上构建应用和服务
三次握手 四次挥手
三次握手
- 客户端发送SYN标志的TCP报文,请求建立连接,同时选择一个初始序列号seq=x(我要建立连接)
- 服务端收到SYN报文后,同意建立连接后,发送一个SYN和ACK = x + 1的标志的TCP报文给客户端,同时也会选择一个序列号seq=Y(连吧,我准备好了)
- 客户端接收到SYN+ACK报文后,发送一个ACK=y+1返回给服务端(我也准备好了)
四次挥手
- 客户端发送一个FIN标志的TCP报文给服务器,请求终止连接,选择一个序列号seq=x(我要关闭连接了)
- 服务端收到客户端的FIN报文,发送一个ACK=x+1,服务器等待连接关闭(好的,你关闭吧)
- 服务器要关闭,发送一个FIN标志的TCP报文,seq=y的报文给客户端(我也要关闭连接了)
- 客户端接收到后,发送一个ACK=y+1报文,客户端等待关闭,最终关闭(好的,你也关闭吧)