TCP与服务优化 -2022-3-17

面试的时候,面试官经常会问关于HTTP,TCP的一些面试题。抛开面试的筛选功能不说,从原理上理解这些网络底层的知识,对各种网络方面的调优是有很大帮助的。那么这篇便是和大家一起盘一盘,TCP/IP,HTTP,HTTPS等网络基础知识。

1 OSI参考模型

OSI (Open System Interconnection) 七层模型是国际标准化组织制定的一个标准参考模型。其分层如下

OSI七层网络模型 相关协议
应用层(Application) HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
表示层(Presentation) Telnet,Rlogin,SNMP,Gopher
会话层(Session) SMTP,DNS
传输层(Transport) TCP,UDP
网络层(Network) ICMP IGMP IP(IPV4 IPV6)
数据链路层(Data Link) ARR,RARP
物理层(Physical) IEEE 802.2 , Ethernet v.2 , Internetwork

Http连接经过TCP,根据IP寻址,通过掩码计算出需要访问的IP地址,数据链路层中通过同网内MAC地址链找到远程的server端。整个过程十分复杂,下面我们先看看与TCP握手相关的内容。

2 TCP

TCP 三次握手

TCP 3次握手

上图为TCP 3次握手的示意图。下面我们结合tcpdump抓取的数据进行逐步分析。

  1. 客户端向服务端发送SYN包到服务器,请求连接。图中第1步,seq 为3125779201

  2. 服务端收到数据包后,对客户端做出回应,返回确认数据包。其中

    ack = step1的seq + 1=3215779202 , seq = 15664366

  3. 客户端收到确认后,检查ack值是否 为step1中的seq+1。 如果是的话将发送确认数据包给服务器。服务器收到数据包确认后。客户端和服务端都进入ESTABLISHED的状态。step3中显示的ack 为1 表示相对序列号,即step2中的 seq(15664366) +1

TCP四次挥手

TCP 4次挥手

上述图为维基百科中TCP 4次挥手示意图,下面我们根据tcpdump抓取的数据信息进行逐步分析。

  1. 客户端,发起挥手请求,向服务端发送FIN报文,并进入FIN_WAIT_1状态。报文数据有seq 169 , ack 2782等 。。
  2. 服务端收到FIN请求后,先向客户端发送表示收到断开请求的FIN报文,报文数据ack 170 。
  3. 服务端随后向客户端发送断开连接的请求,FIN报文中 seq 2782 ,ack 170
  4. 客户端收到服务端的FIN报文后,想服务端发送确认断开连接的报文, 报文数据 ack 2783

HTTPS 的4次握手

HTTPS中采用SSL(Secure Sockets Layer),TSL(Transport Layer Security)方式进行加密传输,其中用到对称加密,非对称加密,证书等环节。

其4次握手步骤如下:

  1. 客户端向服务端发送数据建立安全连接请求,数据包中包含一些报文头信息,以及客户端随机数
  2. 服务端收到客户端的请求后,发送对应的协议的消息,其中包括协议版本,加密方法,会话ID,服务端的随机数,并发送服务端证书链(证书发行方,有效期等信息),公钥及签名等信息。
  3. 客户端收到服务端的协议版本,sessionID以及证书等信息后,会对证书进行验证。验证时会使用到可信第三方在系统中的公钥进行解密验证。 验证通过后,客户端向服务端发送加密数据包(其中包含使用服务端公钥加密后的随机字符串)。
  4. 服务端收到客户端发来的数据,使用服务端的私钥对session key进行解密(会使用客户端传来的随机数构造对称加密算法),并向客户端发送数据,表示secure session 建立,后面启用加密传输(后面的传输过程会使用效率较高的对称加密算法)。

3 TCP 与server端优化

TCP 三次握手过程中有两个队列,SYN队列 和 ACCEPT队列。

在三次握手Client发送SYN后,Server收到SYN 并创建状态为半连接状态(SYN_RCVD/SYN_RECV)的Socket,此时会将这些放到半连接SYN队列

当Server端响应Client端发送SYN/ACK之后,Client端收到ACK响应,Client端的Socket建立(ESTABLISHED),然后向服务端发送ACK,Server收到ACK后服务端的连接变成(ESTABLISHED),然后将成功的连接放入全连接ACCEPT队列

Linux中 backlog (/proc/sys/net/ipv4/tcp_max_syn_backlog )和somaxconn(/proc/sys/net/core/somaxconn)会影响到全连接队列和半连接队列的长度。

Tocmate中acceptCount的设置也会影响backlog的值,调优方面尽量避免堆满accept队列。请求量比较大的话可以适当的增大acceptCount的值,作为优化调整的一部分。(注意acceptCount设置大于128的时候backlog的值则需要修改系统参数来改变)

对于系统参数 /proc/sys/net/ipv4/tcp_max_syn_backlog 及 /proc/sys/net/core/somaxconn中的值,有必要的话也可进行适当调整。

总结

本篇介绍了TCP得三次握手和四次挥手,以及HTTPS的连接过程。以及TCP连接中SYN队列和ACCEPT队列的参数设置等,关于TCP的内容实在是太多。今天只能讲一些我们可能涉及到的地方,后面也会为大家带来更详细的TCP相关知识。

Java Geek Tech wechat
欢迎订阅 Java 技术指北,这里分享关于 Java 的一切。