每天看看网络编程

94 阅读4分钟

前言

一道经典的面试题,http协议和tcp协议的区别和联系,想必大家都被问过,三次握手四次挥手?今天想要从基础开始深刻地理解并回答这个题目。

计算机网络

大学里有一门课,考研408的科目之一,计算机网络。

计算机网络用我自己的话来说就是很多计算机用网络连接起来,基于此,接入网络的计算机就必须使用TCP/IP协议。

有一个经典的网络模型图

image.png

  1. OSI定义的七层网络标准模型
  2. 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请求消息由请求行、请求头、请求体等构成

  1. 请求行 GET /index.html HTTP/1.1
  2. 请求头 键值对保存的元数据,包含HOST、User-Agent、Content-Type、content-Length、Accept
  3. 请求体 参数

http响应消息由状态行、响应头、响应体等构成

  1. 状态行 HTTP/1.1 200 ok
  2. 响应头 键值对保存的元数据,包含Content-Type、Content-Length等
  3. 正文

回答

现在回到面试题 TCP(传输控制协议)

  • 层次:属于传输层
  • 功能:可靠传输,有序
  • 面向连接,传输前需要建立连接

HTTP(超文本传输协议)

  • 层次:属于应用层
  • 功能:定义好了请求和响应格式,支持不同的方法进行不同的操作
  • 基于请求/响应,每个请求都是独立的,不保存会话

关系:HTTP基于TCP连接,HTTP发送请求是因为TCP提供了可靠的字节流传输,保证了数据的完整和顺序,TCP关注的是网络中数据的可靠传输,HTTP关注的是如何在此基础上构建应用和服务

三次握手 四次挥手

三次握手 image.png

  1. 客户端发送SYN标志的TCP报文,请求建立连接,同时选择一个初始序列号seq=x(我要建立连接)
  2. 服务端收到SYN报文后,同意建立连接后,发送一个SYN和ACK = x + 1的标志的TCP报文给客户端,同时也会选择一个序列号seq=Y(连吧,我准备好了)
  3. 客户端接收到SYN+ACK报文后,发送一个ACK=y+1返回给服务端(我也准备好了)

四次挥手 1724227636327.png

  1. 客户端发送一个FIN标志的TCP报文给服务器,请求终止连接,选择一个序列号seq=x(我要关闭连接了)
  2. 服务端收到客户端的FIN报文,发送一个ACK=x+1,服务器等待连接关闭(好的,你关闭吧)
  3. 服务器要关闭,发送一个FIN标志的TCP报文,seq=y的报文给客户端(我也要关闭连接了)
  4. 客户端接收到后,发送一个ACK=y+1报文,客户端等待关闭,最终关闭(好的,你也关闭吧)