面试的时候,面试官经常会问关于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次握手的示意图。下面我们结合tcpdump抓取的数据进行逐步分析。
-
客户端向服务端发送SYN包到服务器,请求连接。图中第1步,seq 为3125779201
-
服务端收到数据包后,对客户端做出回应,返回确认数据包。其中
ack = step1的seq + 1=3215779202 , seq = 15664366
-
客户端收到确认后,检查ack值是否 为step1中的seq+1。 如果是的话将发送确认数据包给服务器。服务器收到数据包确认后。客户端和服务端都进入ESTABLISHED的状态。step3中显示的ack 为1 表示相对序列号,即step2中的 seq(15664366) +1
TCP四次挥手
上述图为维基百科中TCP 4次挥手示意图,下面我们根据tcpdump抓取的数据信息进行逐步分析。
- 客户端,发起挥手请求,向服务端发送FIN报文,并进入FIN_WAIT_1状态。报文数据有seq 169 , ack 2782等 。。
- 服务端收到FIN请求后,先向客户端发送表示收到断开请求的FIN报文,报文数据ack 170 。
- 服务端随后向客户端发送断开连接的请求,FIN报文中 seq 2782 ,ack 170
- 客户端收到服务端的FIN报文后,想服务端发送确认断开连接的报文, 报文数据 ack 2783
HTTPS 的4次握手
HTTPS中采用SSL(Secure Sockets Layer),TSL(Transport Layer Security)方式进行加密传输,其中用到对称加密,非对称加密,证书等环节。
其4次握手步骤如下:
- 客户端向服务端发送数据建立安全连接请求,数据包中包含一些报文头信息,以及客户端随机数。
- 服务端收到客户端的请求后,发送对应的协议的消息,其中包括协议版本,加密方法,会话ID,服务端的随机数,并发送服务端证书链(证书发行方,有效期等信息),公钥及签名等信息。
- 客户端收到服务端的协议版本,sessionID以及证书等信息后,会对证书进行验证。验证时会使用到可信第三方在系统中的公钥进行解密验证。 验证通过后,客户端向服务端发送加密数据包(其中包含使用服务端公钥加密后的随机字符串)。
- 服务端收到客户端发来的数据,使用服务端的私钥对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相关知识。