网络与通信:网络协议及握手

来源:互联网 发布:删除表的数据sql语句 编辑:程序博客网 时间:2024/05/21 06:58

计算机网络技术是互联网发展的基础。它是计算机技术与通信技术结合的产物,是现在信息技术的一个重要组成部分,而且正朝着数字化、高速化、智能化的方向迅速发展。随着3G、4G技术的兴起,越来越多的企业参与到了网络与通信相关的行业的角逐,网络与通信相关的行业的角逐,网络与通信成为信息化浪潮的先锋。而对于网络相关技术的考察也越来越受到各大IT企业的重视。

  • TCP和UDP的区别有哪些
  • 什么叫三次握手什么叫四次断开
    • 引申1TCP为什么需要三次握手采用两次握手可以吗
    • 引申2为什么建立连接协议是三次握手而关闭连接却是四次握手
  • 什么是ARPRARP
  • ping命令是什么
  • 基本的HTTP流程有哪些


TCP和UDP的区别有哪些

传输层协议主要有TCP与UDP。UDP(User Datagram Protocol)提供无连接的通信,不能保证数据包被发送到目标地址,典型的即时传输少量数据的应用程序通常使用UDP。TCP(Transmission Control Protocol )是一种面向连接(连接导向)的、可靠的、基于字节流的通信协议,它为传输大量数据或为需要接受数据许可的应用程序提供连接定向和可靠的通信。

TCP连接就像打电话,用户拨特定的号码,对方在线并拿起电话,然后双方进行通话,通话完毕之后再挂断,整个过程是一个相互联系缺一不可的过程。而UDP连接就像发短信,用户短信发给对方,对方没有收到信息,发送者根本不知道,而且对方是否回答也不知道,对方对信息发送者发送消息也是一样。

TCP与UDP都是一种常用的通信方式,在特定的条件下发挥不同的作用。具体而言,TCP和UDP的区别主要表现为以下几个方面:

(1)TCP是面向连接的传输控制协议,而UDP提供的是无连接的数据报服务。

(2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无需等待对方的应答,所以回出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作。

(3)TCP对系统资源要求较多,UDP对系统资源要求较少

(4)UDP具有较好的实时性,工作效率较TCP高。

(5)UDP的段结构比TCP的段结构简单,因此网络开销也小。

UDP比TCP的效率要高,为什么TCP还能够保留呢?其实,TCP和UDP各有所长、各有所短,适用于不同要求的通信环境,有些环境采用UDP确实高效,而有些环境需要可靠的连接,此时采用TCP则更好。在提及TCP的时候,一般也提及IP。IP协议是一种网络层协议,它规定每个互联网上的计算机都有一个唯一的IP地址,这样数据包就可以通过路由器的转发到达指定的计算机,但IP并不保证数据传输的可靠性。

什么叫三次握手?什么叫四次断开

TCP是一个面向连接的协议,所谓面向连接是指通信双方任何一方向对方发送数据前必须先建立安全通道,就像打电话一样,必须要等到对方的手机响铃,并且对方接听电话时,才能与对方通信。而UDP则不是面向连接的协议,基于UDP的通信双方不需要事先与对方协商并建立连接,也不管对方的IP地址与端口号是否存在,就直接发送数据,这个处理方式有点像手机发短信,不管对方手机是否停机或者关机,只管发送信息,不管对方是否能收到消息。

在TCP/IP中,采用三次握手来建立一次连接, 
(1)第一次握手:建立连接时,客户端发送SYN包(假如序列号SEQ=100)给服务器,并进入SYN_SEND状态,等待服务器的确认。 
(2)第二次握手:服务器收到SYN包之后,必须确认客户端,所以就要发送ACK包(ACK=101),同时服务器还必须发送SYN包(序列号 SEQ=300)等客户端的确认,此时服务器进入SYN_RECV状态 
(3)第三次握手:客户端接收到SYN+ACK包之后,向服务器发送确认包(ACK=301),该包发送完毕,此时客户端与服务器进入ESTABLISHED,两者就可以进行数据交换了,完成三次握手。

由于TCP连接是全双工的,因此每个方向上都必须单独进行关闭,当一方完成数据发送任务后就能发送一个FIN来终止这个方向的连接。一个TCP连接在收到一个FIN之后仍然能够发送数据,首先进行关闭的一方将主动执行关闭,而另一方将会执行被动关闭。

(1)客户端发送数据完毕后,发送一个FIN,提出断开连接要求 
(2)服务器收到该FIN包后,对其作出响应,发送一个ACK包,确认这一方向的连接将关闭 
(3)等服务器的应用程序做好关闭准备时,服务器反方向发送一个FIN包给客户端,请求关闭连接请求。 
(4)客户机对服务器发送的请求进行确认,并发送ACK包。

这里写图片描述

这里写图片描述

在第四步的时候,为什么需要TIME_WAIT?HOST1发送的ACK可能丢失并导致HOST2重新发送重新发送FIN消息,TIME_WAIT维护连接状态。如果执行主动关闭的一方HOST1不进入到TIME_WAIT状态就关闭连接,当重传的FIN消息到达时,因为TCP已经不再有连接的信息了,所以就用RST(重新启动)消息应答,导致HOST2进入错误的状态而不是有序终止状态。如果发送最后ACK消息的一方处于TIME_WAIT状态并仍然记录着连接的信息,它就可以正确地相应对等方HOST2的FIN消息了。

其次,TIME_WAIT为连接中“离群的段”提供从网络中消失的时间,通常情况下,因为TCP仅仅丢弃该数据并影响RST消息,所以这不会造成任何问题。当RST消息到达发出延时段的主机时,因为该主机也没有记录连接的任何信息,所以它也丢弃该段。然而,如果两个相同主机之间又建立 了一个具有相同端口号的新连接,那么离群的段就可能被看穿是新连接的;如果离群的段中数据的任何序列号恰恰在新连接的当前接收窗口中,数据就会被重新接收,其结果就是破坏新连接。。

引申1:TCP为什么需要三次握手,采用两次握手可以吗

建立连接的过程是利用客户服务器模式,假设主机A为客户端,主机B为服务器端。

(1)TCP的三次握手过程:主机A向主机B发送连接请求,主机B对收到的主机A的报文段进行确认,主机A再次对主机B的确认进行确认。

(2)采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑到这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B资源浪费。

(3)采用两次握手不行,原因就是上面说额失效的连接请求的特殊情况。。

引申2:为什么建立连接协议是三次握手,而关闭连接却是四次握手?

因为服务器端的LISTEN状态下的SOCKET收到SYN报文的建立连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你未必会马上关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示同意现在可以关闭连接了,所以这里的ACK报文和FIN报文多数情况下都是分开发送的。。

什么是ARP/RARP

ARP(Address Resolution Protocol 地址解析协议)是一个位于TCP/IP协议栈的低层协议,它用于映射计算机的物理地址与网络IP地址。在Internet分布式环境中,每个主机都被分配了一个32位的网络地址,此时就存在将计算机的IP地址与物理地址之间的转换问题。ARP所要做的工作就是在主机发送帧前,根据目标IP地址获取MAC地址,以保证通信过程的顺畅。

具体过程如下: 
(1)每台主机都会在自己的ARP缓冲区中建立一个ARP列表,用于存储IP地址与MAC地址的对应关系。 
(2)当源主机需要将一个数据包发送到目标主机时,会先检查自己的ARP列表是否存在该IP地址对应的MAC地址。如果存在则直接将数据包发送到该MAC地址;如果不存在,就向本地网段发起一个ARP请求的广播包,由于查询目标主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址以及目标主机的IP地址等。 
(3)网络中所有的主机收到这个ARP请求之后,会检查数据包中的IP是否与自己的IP地址一致,如果不同就忽略此数据包;如果相同,该主机会将发送端的MAC地址与IP地址添加到自己的ARP列表中。如果ARP列表中已经存在该IP地址的相关信息,则将其覆盖掉,接着给源主机发送一个ARP响应包,告诉对方自己是它所找的MAC地址。 
(4)源主机收到这个ARP响应包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应包,则表示ARP查询失败。

RARP与ARP工作方式相反。RARP发出要反向解析的物理地址并希望返回其对应的IP地址,应答包括由能够提供所需信息的RARP服务器发出的IP地址。RARP获取IP地址的过程如下: 
首先需要知道自己IP地址的机器向另一台机器上的服务器发送请求,并等待服务器发出响应,开始不知道服务器的物理地址所以通过广播。一旦通过广播对地址的请求,就必须唯一标识自己的硬件标识(如CPU序列号),这个标识能让可执行程序容易获得。源主机收到从RARP服务器的响应消息后,就可以利用得到的IP地址进行通信。

ping命令是什么

Ping(Packet Internet Grope,因特网包探索器)是一个用于测试网络连接量的程序。它使用的是ICMP,ping发送一个ICMP(Internet Control and Message Protocal,因特网控制报文协议)请求消息给目的地并报告是否收到所希望的ICMP应答。

ICMP是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。它是用来检查网络是否通畅或网络连接速度的命令。 
由于网络上的机器都有唯一确定的IP地址,当给目标IP地址发送一个数据包(包括对方的IP地址和自己的地址以及序列数)时,对方就要返回一个同样大小的数据包(包括双方地址),根据返回的数据包可以确定目标主机的存在,可以初步判断目标主机的操作系统等。

基本的HTTP流程有哪些

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,其主要负责服务器与浏览器之间的通信。HTTP把客户端浏览器的请求发送到服务器,并把响应的网页内容由服务器返回到客户端浏览器。

一次完整的HTTP流程一般包括以下几个步骤: 
(1)打开HTTP连接。因为HTTP是一种无状态协议,所以每一个请求都需要建立一个新的连接。

(2)初始化方法请求。包含一些类型的方法指示符,它们用来描述调用什么方法和需要什么参数

(3)设置HTTP请求头。包含要传输的数据类型和数据长度

(4)发送请求。即将二进制流写入服务器

(5)读取请求。调用目标servlet程序,并接受HTTP请求数据。如果该次请求为客户端第一次请求,则需要创建一个新的服务器对象实例。

(6)调用方法。提供了服务器端调用对象的方法

(7)初始化响应方法。如果调用的方法出现异常,客户将会受到出错信息;否则,发送返回类型

(8)设置HTTP响应头。响应头中设置待发送的数据类型与长度

(9)发送响应。服务器端发送二进制流给客户端作为响应。

(10)关闭连接,当响应结束后,与服务器必须断开连接,以保证其他请求能够与服务器建立连接。


TCP协议中的三次握手和四次挥手(图解)

建立TCP需要三次握手才能建立,而断开连接则需要四次握手。整个过程如下图所示:

先来看看如何建立连接的。


首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。

那如何断开连接呢?简单的过程如下:


【注意】中断连接端可以是Client端,也可以是Server端。

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

整个过程Client端所经历的状态如下:


而Server端所经历的过程如下:转载请注明:blog.csdn.net/whuslei


【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。


0 0
原创粉丝点击