TCP/IP HTTP 三次握手和四次握手

原文地址:http://www.cnblogs.com/kxdblog/p/4202059.html

TCP四层模型功能

TCP模型特点

TCP三次握手过程

TCP四次挥手过程

一. TCP/IP协议族

OSI模型和TCP/IP模型对应关系

     

    物理层 --- 数据表示。物理层规定了激活、维持、关闭通信端点之间的机械特性、电气特性、 功能特性以及过程特性。该层为上层协议提供了一个传输数据的物理媒体。。

    数据链路层 --- 主机间通信。数据链路层在不可靠的物理介质上提供可靠的传输。SDLC、HDLC、PPP、STP、帧中继等

    网络层 ---寻址和最短路径。网络层负责对子网间的数据包进行路由选择。此外,网络层还可以实现拥塞控制、网际互连等功能。IP、IPX、RIP、OSPF等。

    传输层 --- 端到端的连接。 传输层是第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。TCP、UDP、SPX等。

    会话层 --- 介质访问。会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步

    表示层 --- 表示层对上层数据或信息进行变换。以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等 

    应用层 --- 应用层为操作系统或网络应用程序提供访问网络服务的接口。Telnet、FTP、 HTTP、SNMP等。

 

TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能。包含以下四个层次:

TCP四层模型功能

1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。

2. 网络层,也称作互联网层,处理分组在网络中的活动,例如分组的选路。网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。

3. 运输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通信。他所作的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端通信,因此应用层可以忽略所有这些细节。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必须的可靠性必须由应用层来提供。

4. 应用层负责处理特定的应用程序细节。包括Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传送协议)以及SNMP(简单网络管理协议)等。


拥塞控制

TCP采用慢开始和拥塞避免的方法控制发送
慢开始的思路是,先测试一下,在由小到大的增大发送窗口
具体的:预先设置一个慢开始门限,ssthresh(用于控制拥塞)
先设拥塞窗口cwnd=1,发送第一个报文,收到确认后把cwnd设为2,在发送,收到回复后,再把cwnd增加2个,即,收到回复后就把cwnd增加一倍,这就是慢开始算法
当cwnd>ssthresh就停止上述的慢开始算法而使用拥塞避免算法
拥塞避免算法就是每收到一个回复后就把cwnd加1,直到出现拥塞
无论在慢开始还是拥塞避免时只要出现拥塞就把ssthresh设为cwnd值的一半(这就是乘法减小)并把cwnd设为1,在执行慢开始算法,重复上述过程

流量控制

 利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
    设A向B发送数据。在连接建立时,B告诉了A:“我的接收窗口是rwnd = 400”(这里的rwnd表示receiver window)。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。请注意:TCP的窗口单位是字节,不是报文段

 

 

wireshark抓到的包与对应的协议层如下图所示:

 

 

1. Frame:   物理层的数据帧概况

2. Ethernet II: 数据链路层以太网帧头部信息

3. Internet Protocol Version 4: 互联网层IP包头部信息

4. Transmission Control Protocol:  传输层的数据段头部信息,此处是TCP

5. Hypertext Transfer Protocol:  应用层的信息,此处是HTTP协议

二. TCP协议

TCP模型特点

      TCP是一种面向连接(连接导向)的、可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。

      TCP的特点有:

1. TCP是面向连接的运输层协议

2. 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的

3. TCP提供可靠交付的服务

4. TCP提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。

5. 面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流

      TCP报文首部,如下图所示:

 

1. 源端口号:数据发起者的端口号,16bit

2. 目的端口号:数据接收者的端口号,16bit

3. 序号:32bit的序列号,由发送方使用

4. 确认序号:32bit的确认号,是接收数据方期望收到发送方的下一个报文段的序号,因此确认序号应当是上次已成功收到数据字节序号加1。

5. 首部长度:首部中32bit字的数目,可表示15*32bit=60字节的首部。一般首部长度为20字节。

6. 保留:6bit, 均为0

7. 紧急URG:当URG=1时,表示报文段中有紧急数据,应尽快传送。

8. 确认比特ACK:ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包。

9. 推送比特PSH:当发送端PSH=1时,接收端尽快的交付给应用进程。

10. 复位比特(RST):当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。

11. 同步比特SYN:在建立连接是用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。

12. 终止比特FIN:FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。

13. 窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限。

14. 检验和:该字段检验的范围包括首部和数据这两部分。由发端计算和存储,并由收端进行验证。

15. 紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。

16. 选项:长度可变,最长可达40字节

wireshark捕获到的TCP包中的每个字段如下图所示:

 

 

 

 

三. TCP三次握手

       TCP建立连接时,会有三次握手过程,如下图所示,wireshark截获到了三次握手的三个数据包。第四个包才是http的,说明http的确是使用TCP建立连接的。

 

TCP三次握手过程

第一次握手:客户端向服务器发送连接请求包,标志位SYN(同步序号)置为1,序号为X=0

第二次握手:服务器由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号Y=0(随机),将确认序号(Acknowledgement Number)设置为客户的序列号加1,即X+1 = 0+1=1

第三次握手:客户端收到服务器发来的包后检查确认序号(Acknowledgement Number)是否正确,即第一次发送的序号加1(X+1=1)。以及标志位ACK是否为1。若正确,服务器再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号(Acknowledgement Number)=Y+1=0+1=1,发送序号为X+1=1。客户端收到后确认序号值与ACK=1则连接建立成功,可以传送数据了。

 

下面来逐步分析三次握手过程:

第一次握手:客户端向服务器发送连接请求包,标志位SYN(同步序号)置为1,序号为X=0

 

 

第二次握手:服务器收到客户端发过来报文,由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号Y=0,将确认序号(Acknowledgement Number)设置为客户的序列号加1,即X+1 = 0+1=1, 如下图:

第三次握手:客户端收到服务器发来的包后检查确认序号(Acknowledgement Number)是否正确,即第一次发送的序号加1(X+1=1)。以及标志位ACK是否为1。若正确,服务器再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号(Acknowledgement Number)=Y+1=0+1=1,发送序号为X+1=1。客户端收到后确认序号值与ACK=1则连接建立成功,可以传送数据了。

 

四. TCP四次挥手

       TCP断开连接时,会有四次挥手过程,如下图所示,wireshark截获到了四次挥手的四个数据包。

 

TCP四次挥手过程

 第一次挥手:客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。将标志位FIN和ACK置为1,序号为X=1,确认序号为Z=1。

第二次挥手:服务器收到FIN后,发回一个ACK(标志位ACK=1),确认序号为收到的序号加1,即X=X+1=2。序号为收到的确认序号=Z。

第三次挥手:服务器关闭与客户端的连接,发送一个FIN。标志位FIN和ACK置为1,序号为Y=1,确认序号为X=2。

第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认序号为收到的序号加1,即Y+1=2。序号为收到的确认序号X=2。

 

下面来逐步分析四次挥手过程:

第一次挥手:客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。将标志位FIN和ACK置为1,序号为X=1,确认序号为Z=1。

 

第二次挥手:服务器收到FIN后,发回一个ACK(标志位ACK=1),确认序号为收到的序号加1,即X=X+1=2。序号为收到的确认序号=Z。

 

第三次挥手:服务器关闭与客户端的连接,发送一个FIN。标志位FIN和ACK置为1,序号为Y=1,确认序号为X=2。

第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认序号为收到的序号加1,即Y+1=2。序号为收到的确认序号X=2。

还可以参考此处此处

重点补充一下:

在四次挥手的分析过程中,只看到1、3、4次挥手的数据包,第二次的不见了。

原来是因为:ACK延迟发送机制。为了提高性能,TCP在收到ACK之后会攒起来而不是立即发送的,在几种情况下才会发送:

1 超过MSS(可以理解为攒得太多了,放不下了)
2 有FIN
3 系统设置为禁用延迟(TCP_NODELAY)

倒数第二条的前面应该还有一个ACK,因为不符合上述3条,所以被延迟(一般是40ms或者200ms)了,等到倒数第二条发出时符合条件了(有FIN)就一块发出来了,所以4次挥手只能看到3个包。如果系统禁用了延迟发送,就会看到4个包了。

所以据我自己理解,首先客户端会发送关闭的请求(FIN=1,ACK=1),本来在第二次挥手中,应该发送ACK=Seq+1给客户端,但因为被延迟,直到服务器需要发送FIN才一起发送出来(FIN=1,ACK=1),这样子可以节省能量,最后客户端收到服务器的FIN后,发回ACK进行确认。

 

简单的例子:

如果在字符界面下,用wget http://www.google.com.hk 访问网址,如果有GUI,可以打开firefox浏览器访问http://www.google.com.hk

0.003183              192.168.21.137  72.14.203.147     TCP        38039 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSV=36941509 TSER=0 WS=6

0.011707              72.14.203.147     192.168.21.137  TCP        http > 38039 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0 MSS=1460

0.011770              192.168.21.137  72.14.203.147     TCP        38039 > http [ACK] Seq=1 Ack=1 Win=5840 Len=0

以上三个数据包就是著名的TCP三次握手的数据包,其中38039是客户端的TCP端口,http的默认端口是80,如果tcpdump在/etc/services中发现端口对应的服务名称,那么会自动的转为名字,所以这里会显示为http。表示客户端的38039端口和服务器端的http端口进行TCP三次握手。

R1区域用来显示简单的数据包信息,我们用tcpdump抓包的时候,默认情况下也是显示成这样的;R2区域用来显示选中的数据包的详细信息,细心一点会发现他是按照TCP/IP四层结构显示的,第一行是数据链路层的信息,第二行是网络层信息(IP协议),第三行是传输层信息(TCP协议),第四行是应用层信息(HTTP协议),可以展开每一行用来观察具体的内容;R3区域是用来显示此数据包的真实面目。我们在R1和R2区域看到的信息都是Wireshark整理以后给我们看的,抓包的真实数据实际上是一堆二进制序列,用ultraedit打开google.cap文件可以看到就是一些数字

猜你喜欢

转载自blog.csdn.net/changcsw/article/details/52103640