文章目录
1. TCP/IP简介
在全球各地,各种各样的服务器或者电脑,运行着不同的操作系统为大家服务,这些服务器(电脑)在表达同一种信息时,所使用的方法是千差万别。
就像圣经中上帝打乱了各地人的语言,让他们无法合作一样。
但计算机使用者意识到,计算机只单兵作战作用不大。只有把它们联合起来,服务器(电脑)才会发挥出它最大的潜力。于是,人们就想方设法地用电线把电脑连接到了一起。
但是简单的连到一起远远不够,就好像语言不通的两个人互相见了面,完全不能交流信息。
因而,他们需要定义一些共通的东西来进行交流,TCP/IP
就是为此而生。
TCP/IP
不是一个协议,而是一个协议族的统称,包括了IP
协议,IMCP
协议,TCP
协议,以及我们更熟悉的http
、ftp
、pop3
协议等。
服务器(电脑)有了这些,就好像学会了外语一样,就可以和其他的计算机终端自由交流。
2. TCP/IP模型
TCP/IP
模型中的各种协议,依其功能不同,被分别归属到如下四层
中。
2.1 应用层
向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等,如下所示:
-
远程登录(telnet
使用
telnet协议提供在网络其它主机上注册的接口,
telnet`会话提供了基于字符的虚拟终端。 -
文件传输访问
FTP
使用FTP协议
来提供网络内机器间的文件拷贝功能。
2.2 传输层
提供应用程序间的通信,其功能包括:
-
格式化信息流
-
提供可靠传输
为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。
2.3 网络层
负责相邻计算机之间的通信,其功能包括如下三方面:
-
处理来自传输层的分组发送的请求,收到请求后,将分组装入
IP
数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。 -
处理输入数据报:首先检查其合法性,然后进行寻径——假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。
-
处理路径、流控、拥塞等问题。
2.4 网络接口层:
这是TCP/IP
协议的最低层,负责接收IP
数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报
,交给IP层
。
3. 详述IP
IP
用于计算机之间的通信。
IP
是无连接的通信协议,它不会占用两个正在通信的计算机之间的通信线路。
这样,IP
就降低了对网络线路的需求,每条线可以同时满足许多不同的计算机之间的通信需要。
通过 IP
,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。
IP
负责将每个包路由至它的目的地。
接下来,我会从IP地址,TCP使用固定的连接,IP路由器,域名等介绍IP。
3.1 IP地址
每个计算机必须有一个IP
地址才能够连入因特网。
每个IP
包必须有一个地址才能够发送到另一台计算机。
网络上每一个节点都必须有一个独立的Internet
地址(也叫做IP
地址)。
我们现在常使用的IP
地址是一个32bit
的数字,也就是我们常说的IPv4
标准,这32bit
的数字分成四组,就是常见的255.255.255.255
的样式。
IPv4
标准上,地址被分为五类,我们常用的是B类
地址。
【注意】需要注意的是IP
地址是网络号+主机号的组合,这非常重要。
CP/IP
使用32
个比特来编址,一个计算机字节是8
比特,故TCP/IP
使用了4
个字节。
一个计算机字节可以包含 256 个不同的值:00000000、00000001、00000010、00000011、00000100、00000101、00000110、00000111、00001000 … 直至 11111111。
你现在应该知道了:为什么TCP/IP
地址是介于0
到255
之间的4
个数字。
3.2 TCP固定的连接
TCP
用于应用程序之间的通信。
当应用程序希望通过TCP
与另一个应用程序通信时,它会发送一个通信请求,这个请求必须被送到一个确切的地址。
在双方握手
之后,即双方通信成功,TCP
将在两个应用程序之间建立一个全双工(full-duplex)
的通信。
这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。
UDP
和TCP
很相似,但是更简单,同时可靠性低于TCP
。
3.3 IP路由器
当一个IP
包从一台计算机被发送,它会到达一个IP
路由器。
IP
路由器负责将这个包路由至它的目的地,直接地或者通过其他的路由器。
在一个相同的通信中,一个包所经由的路径可能会和其他的包不同。
而路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址。
3.4 域名
12
个阿拉伯数字很难记忆,使用一个名称更容易。
用于TCP/IP
地址的名字被称为域名,比如www.baidu.com
就是一个域名。
当你键入一个类似https://www.baidu.com/
的域名,域名会被一种DNS
程序翻译为数字。
在全世界,数量庞大的DNS
服务器被连入因特网。
DNS
服务器负责将域名翻译为TCP/IP
地址,同时负责使用新的域名信息更新彼此的系统。
当一个新的域名连同其TCP/IP
地址一同注册后,全世界的DNS
服务器都会对此信息进行更新。
3.5 TCP与IP的关系
TCP/IP
意味着TCP
和IP
在一起协同工作:
-
TCP
负责应用软件(比如你的浏览器)和网络软件之间的通信。 -
IP
负责计算机之间的通信。
TCP
负责将数据分割并装入IP
包,然后在它们到达的时候重新组合它们。
IP
负责将包发送至接受者。
4. 详述TCP
如下从TCP
的报文格式,三次握手,SYN
攻击,四次挥手等介绍TCP
。
4.1 TCP报文格式
TCP
报文格式如下图所示,接着会详细介绍图中的知识点。
16位
源端口号:16位
的源端口中包含初始化通信的端口。
源端口和源IP
地址的作用是标识报文的返回地址。
16位
目的端口号:16位
的目的端口域定义传输的目的。
这个端口指明报文接收计算机上的应用程序地址接口。
32位
序号:32位
的序列号由接收端计算机使用,重新分段的报文成最初形式。
当SYN
出现,序列码实际上是初始序列码(Initial Sequence Number,ISN
,而第一个数据字节是ISN+1
。
这个序列号(序列码)可用来补偿传输中的不一致。
32位
确认序号:32位
的序列号由接收端计算机使用,重组分段的报文成最初形式。
如果设置了ACK
控制位,这个值表示一个准备接收的包的序列码。
-
4位
首部长度:4位
包括TCP
头大小,指示何处数据开始。 -
保留
(6位)
:6位
值域,这些位必须是0
,为了将来定义新的用途而保留。 -
标志:
6位
标志域,表示为如下:-
紧急标志
-
有意义的应答标志
-
推标志
-
重置连接标志
-
同步序列号标志
-
完成发送数据标志
-
按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN
。
接下来会详细介绍这6位标志域
。
16位
窗口大小:用来表示想收到的每个TCP
数据段的大小。
TCP
的流量控制由连接的每一端通过声明的窗口大小来提供。
窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。
窗口大小是一个16字节
字段,因而窗口大小最大为65535字节
。
16位
校验和:16位TCP
头。
源机器基于数据内容计算一个数值,收信息机要与源机器数值 结果完全一样,从而证明数据的有效性。
检验和覆盖了整个的TCP
报文段:这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证的。
16位
紧急指针:指向后面是优先数据的字节,在URG
标志设置了时才有效。
如果URG
标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。
- 选项:长度不定,但长度必须为
1
个字节。
如果没有选项就表示这个1
字节的域等于0
。
- 数据:该
TCP
协议包负载的数据。
在上述字段中,6位标志域
的各个选项功能如下:
-
URG
:紧急标志。紧急标志为1
表明该位有效。 -
ACK
:确认标志,表明确认编号栏有效,大多数情况下该标志位是置位的。
TCP
报头内的确认编号栏内包含的确认编号(w+1)
为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。
PSH
:推标志。
该标志置位时,接收端不将该数据进行队列处理,而是尽可能快地将数据转由应用处理。
在处理Telnet
或rlogin
等交互模式的连接时,该标志总是置位的。
-
RST
:复位标志,用于复位相应的TCP
连接。 -
SYN
:同步标志,表明同步序列编号栏有效。
该标志仅在三次握手建立TCP
连接时有效。
它提示TCP
连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。
在这里,可以把TCP
序列编号看作是一个范围从0
到4
,294
,967
,295
的32
位计数器。
通过TCP
连接交换的数据中每一个字节都经过序列编号。
在TCP
报头中的序列编号栏包括了TCP
分段中第一个字节的序列编号。
FIN
:结束标志。
4.2 TCP三次握手
所谓三次握手(Three-Way Handshake)
即建立TCP
连接,就是指建立一个TCP
连接时,需要客户端和服务端总共发送3个包
以确认连接的建立。
在socket
编程中,这一过程由客户端执行connect
来触发,整个流程如下图所示:
图上的client意为客户端,server意为服务端。
- 第一次握手:
Client
将标志位SYN
置为1
,随机产生一个值seq=J
,并将该数据包发送给Server
。
Client
进入SYN_SENT
状态,等待Server
确认。
- 第二次握手:
Server
收到数据包后,由标志位SYN=1
知道Client
请求建立连接。
Server
将标志位SYN
和ACK
都置为1
,ack=J+1
,随机产生一个值seq=K
,并将该数据包发送给Client
以确认连接请求。
Server
进入SYN_RCVD
状态。
- 第三次握手:
Client
收到确认后,检查ack
是否为J+1
,ACK
是否为1
。
如果正确则将标志位ACK
置为1
,ack=K+1
,并将该数据包发送给Server
。
Server
检查ack
是否为K+1
,ACK
是否为1
。如果正确则连接建立成功,Client
和Server
进入ESTABLISHED
状态,完成三次握手。
随后,Client
与Server
之间可以开始传输数据了。
简单来说,就是
-
建立连接时,客户端发送
SYN
包(SYN=i)
到服务器,并进入到SYN-SEND
状态,等待服务器确认 -
服务器收到
SYN
包,必须确认客户的SYN(ack=i+1)
,同时自己也发送一个SYN
包(SYN=k)
。即SYN+ACK
包,此时服务器进入SYN-RECV
状态 -
客户端收到服务器的
SYN+ACK
包,向服务器发送确认报ACK(ack=k+1)
。此包发送完毕,客户端和服务器进入ESTABLISHED
状态。完成三次握手,客户端与服务器开始传送数据。
4.3. SYN攻击
三次握手过程中,Server
发送SYN-ACK
之后,收到Client
的ACK
之前的TCP
连接称为半连接(half-open connect)
,
此时,Server
处于SYN_RCVD
状态。
当收到ACK
后,Server
转入ESTABLISHED
状态。
SYN
攻击就是Client
在短时间内伪造大量不存在的IP
地址,并向Server
不断地发送SYN
包。Server
回复确认包,并等待Client
的确认。
由于源地址是不存在的,因此,Server
需要不断重发直至超时,这些伪造的SYN
包将产时间占用未连接队列,导致正常的SYN
请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。
SYN
攻击是一种典型的DDOS
攻击。
检测SYN
攻击的方式非常简单,即当Server
上有大量半连接状态且源IP
地址是随机的,则可以断定遭到SYN
攻击了,使用如下命令可以让之现行:
netstat -nap | grep SYN_RECV
4.4 TCP四次挥手
所谓四次挥手(Four-Way Wavehand)
即终止TCP
连接,就是指断开一个TCP
连接时,需要客户端和服务端总共发送4个包以确认连接的断开。
在socket
编程中,这一过程由客户端或服务端任一方执行close
来触发,整个流程如下图所示:
由于TCP
连接时全双工的,因此,每个方向都必须要单独进行关闭。
这一原则是当一方完成数据发送任务后,发送一个FIN
来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了。
但是在这个TCP
连接上仍然能够发送数据,直到这一方向也发送了FIN
。
首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
-
第一次挥手:
Client
发送一个FIN
,用来关闭Client
到Server
的数据传送,Client
进入FIN_WAIT_1
状态。 -
第二次挥手:
Server
收到FIN
后,发送一个ACK
给Client
,确认序号为收到序号+1
(与SYN
相同,一个FIN
占用一个序号)。Server
进入CLOSE_WAIT
状态。 -
第三次挥手:
Server
发送一个FIN
,用来关闭Server
到Client
的数据传送。Server
进入LAST_ACK
状态。 -
第四次挥手:
Client
收到FIN
后,Client
进入TIME_WAIT
状态,接着发送一个ACK
给Server
,确认序号为收到序号+1
。Server
进入CLOSED
状态,完成四次挥手。
5. 简述HTTP协议
HTTP
是一个基于TCP/IP
通信协议来传递数据(HTML
文件,图片文件,,查询结果等)。
HTTP
是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
它于1990年提出
,经过几年的使用与发展,得到不断地完善和扩展。
目前在WWW
中使用的是HTTP/1.0
的第六版,HTTP/1.1
的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)
的建议已经提出。
HTTP
协议工作于客户端-服务端架构为上。
浏览器作为HTTP
客户端通过URL
向HTTP
服务端即WEB
服务器发送所有请求。
Web
服务器根据接收到的请求后,向客户端发送响应信息。
TCP/IP
协议并不是一个协议,而是一个协议簇,这些协议的目的,就是使计算机之间可以进行信息交换,并且两大协议其中都包含其他的协议,虽然放在了一起,但它们的作用和工作是不一样的。
HTTP
协议定义了内容的格式,这是一个应用层的协议,应用层协议的内容需要通过传输层在浏览器和服务器之间传送。
TCP/IP
协议是ISO
网络参考模型的一种实现,在TCP/IP
协议中,与网络程序员相关的主要有两层:
-
传输层:传输层协议负责解决数据传输问题,包括数据通行的可靠性问题。传输层依赖更底层的网络层来完成实际的数据传输,在
TCP/IP
网络协议中,负责可靠通信的传输层协议为TCP
协议。 -
应用层:网络层一般用网络驱动来实现,普通的程序员不会涉及。在
TCP/IP
协议中,网络层的协议为IP
协议。
5.1 HTTP请求处理图解
浏览器与Web
服务器之间的协议是应用层协议,当前,我们主要遵循的协议为HTTP/1.1
。
HTTP
协议是Web
开发的基础,这是一个无状态的协议,客户机与服务器之间通过请求和相应完成一次会话(Session)
。
客户端、web
服务器、HTTP
三者之间的联系如下所示:
- 客户端与
web
服务器工作过程
当浏览器寻找到Web
服务器的地址之后,浏览器帮助我们把对服务器的请求转换为一系列参数发送给Web
服务器。
服务器受到浏览器发来的请求参数之后,将会分析这些数据,并进行处理。
然后向浏览器回应处理的结果,也就是一些新的数据。这些数据通常是HTML
网页或者图片。
浏览器收到之后,解析这些数据,将它们呈现在浏览器的窗口中,这就是我们看到的网页。
- 客户端与
web
服务器遵守共同标准:HTTP协议
在浏览器与Web
服务器的对话中,需要使用双方都能够理解的语法规范进行通信,这种程序之间进行通信的语法规范,我们称之为协议。
协议有许多种,根据国际标准化组织ISO
的网络参考模型,程序与程序之间的通信可分为7
层,从低到高依次为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
。
ISO
模型如下图所示:
- 客户端、
web
服务器、数据库服务器图解如下图所示:
5.2 浏览器与服务器图解
HTTP协议
就是TCP/IP
协议中专门用于浏览器与Web
服务器之间通信的应用层协议。
应用层协议依赖于传输层协议完成数据传输,传输层协议依赖于网络层协议王城数据传输,他们之间的关系如下图(浏览器与服务器之间网络通信的传输过程):
6. 补充介绍
-
为什么建立连接是三次握手,而关闭连接却是四次挥手?
这是因为服务端在LISTEN
状态下,收到建立连接请求的SYN
报文后,把ACK
和SYN
放在一个报文里发送给客户端。
而关闭连接时,当收到对方的FIN
报文时,仅仅表示对方不再发送数据,但是还能接收数据。
己方也未必全部数据都发送给对方了,所以己方可以立即close
。
也可以发送一些数据给对方后,再发送FIN
报文给对方来表示同意现在关闭连接。
因此,己方ACK
和FIN
一般都会分开发送。
-
为什么`TIME_WAIT`状态需要经过`2MSL`(最大报文段生存时间)才能返回到`CLOSE`状态?
原因如下所示:
- 保证
TCP
协议的全双工连接能够可靠关闭
如果Client
直接CLOSED
了,那么由于IP
协议的不可靠性或者是其它网络原因,导致Server
没有收到Client
最后回复的ACK
。
那么,Server
就会在超时之后继续发送FIN
,此时由于Client
已经CLOSED
了,就找不到与重发的FIN
对应的连接,最后Server
就会收到RST
而不是ACK
。Server
就会以为是连接错误把问题报告给高层。
这样的情况虽然不会造成数据丢失,但是却导致TCP
协议不符合可靠连接的要求。
所以,Client
不是直接进入CLOSED
,而是要保持TIME_WAIT
。当再次收到FIN
时,能够保证对方收到ACK,最后正确的关闭连接。
- 保证这次连接的重复数据段从网络中消失
如果Client
直接CLOSED
,然后,又再向Server
发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。
也就是说有可能新连接和老连接的端口号是相同的。
一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server
。
由于新连接和老连接的端口号是一样的,又因为TCP
协议判断不同连接的依据是socket pair
。
于是,TCP
协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。
所以TCP
连接还要在TIME_WAIT
状态等待2倍MSL
,这样可以保证本次连接的所有数据都从网络中消失。