TCP
TCP的三次握手过程,为什么需要三次握手
三次握手过程:
- 客户端:向服务端发送带有 SYN=1,ACK=0的数据包,选择一个初始的序号 x,第一次握手
- 服务端:向客户端发送SYN=1,ACK=1的数据包,确认号为 x+1,选择一个初始的序号 y,第二次握手
- 客户端:向服务端发送ACK=1的数据据包,确认号为 y+1,序号为 x+1
为什么要三次握手:
三次握手的目的是建立可靠的通信信道,通讯简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常
第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己接收正常,对方发送正常
第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送接收正常
所以三次握手就能确认双发收发功能都正常,缺一不可。
如果只有两步是无法确定客户端是否能够正常接收,同时可能无法就Server的B的初始序号达成一致
第2步是为了Server向Client表示已经收到了Client的握手信号,同时也是为了向Client发送握手信号,并发迸Server的初始序号。
第3步是为了表示Client的接收到了Server的握手信息
补充内容:A表示Client,B表示Server
- 第一个包,即A发给B的SYN 中途被丢,没有到达B。A会周期性超时重传,直到收到B的确认
- 第二个包,即B发给A的SYN +ACK 中途被丢,没有到达A。B会周期性超时重传,直到收到A的确认
- 第三个包,即A发给B的ACK 中途被丢,没有到达B。A发完ACK,单方面认为TCP为 Established状态,而B显然认为TCP为Active状态:
- 假定此时双方都没有数据发送,B会周期性超时重传,直到收到A的确认,收到之后B的TCP 连接也为 Established状态,双向可以发包。
- 假定此时A有数据发送,B收到A的 Data + ACK,自然会切换为established 状态,并接受A的 Data。
- 假定B有数据发送,数据发送不了,会一直周期性超时重传SYN + ACK,直到收到A的确认才可以发送数据。
TCP的四次挥手的过程,为什么要4次挥手
X=1, Y=1, Z=1//第一次挥手,客户端发送FIN+ACKFIN=1, ACK=1;seq_number=X; // 1ack_number=Z; // 1// 第二次挥手,服务器收到FIN后,发回一个ACKACK=1seq_num=Z; // 1ack_num=x+1; // 2// 第三次挥手,服务器关闭与客户端的连接,发送FINFIN=1, ACK=1;seq_num=Y; //1ack_num=X+1; //2// 第四次挥手,客户端收到服务器发送的FIN之后,发回ACK确认ACK=1seq_num=X+1; //2ack_num=Y+1; //2复制代码
主动断开的一方:主动关闭方(A),另一方是被动关闭方(B)
- A向B发送一个FIN,并且序号为u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时表示A不再向B发送数据包
- B收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1,同时带上序号为v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。此步仅仅是为了向A告知B已经知道了断开连接的请求。B此时可能还需要处理A请求断开之前的数据包,也可能向A发送数据
- A收到B的确认请求后,此时,A就进入FIN-WAIT-2(终止等待2)状态,等待B发送连接释放报文
- B在处理完数据报文后,便发送给主动方FIN报文。并且序号为w,ack为u+1.这一步的目的是为了告诉A已经处理完断开之前的数据报。
- A发送ACK,确认已经收到B的FIN报文,确认序号为w+1。此时,A就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当A撤销相应的TCB后,才进入CLOSED状态
- B只要收到了客户端发出的确认,立即进入CLOSED状态
为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
TCP、UDP协议的区别
UDP提供无连接不可靠的数据传输服务。UDP 在传送数据之前不需要先建立连接,主机在收到 UDP 报文后,不需要给出任何确认。UDP 不提供可靠交付,但在某些情况下 UDP 效率更高。
TCP 提供面向连接可靠的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的运输服务,增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。
UDP的主要特点
- UDP 是无连接的;
- UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
- UDP 是面向报文的;
- UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 直播,实时视频会议等);
- UDP 支持一对一、一对多、多对一和多对多的交互通信;
- UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
TCP的主要特点
- TCP 是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
- 每一条 TCP 连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);
- TCP 提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
- TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
- 面向字节流。TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
TCP 协议如何保证可靠传输
- 应用数据被分割成 TCP 认为最适合发送的数据块。
- TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
- TCP 的接收端会丢弃重复的数据。
- 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
- 拥塞控制: 当网络拥塞时,减少数据的发送。
- 停止等待协议 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
问题
1. 各层协议的作用,以及 TCP/IP 协议的特点。
物理层主要设备:中继器、集线器; 数据链路层主要设备:二层交换机、网桥; 网络层主要设备:路由器。
(1).应用层
应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的 HTTP协议,支持电子邮件的 SMTP协议等等。我们把应用层交互的数据单元称为报文。
(2).运输层
运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。运输层主要使用TCP和UDP两种协议
(3).网络层
网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称 数据报。
(4).数据链路层
数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装程帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
(5).物理层
物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。 使其上面的数据链路层不必考虑网络的具体传输介质是什么。
2. 以太网的特点,以及帧结构。
以太网的特点
以太网的优点主要表现在四个方面:廉价的适配器卡、容易安装、广泛使用、速率高。缺点主要表现在两个方面:重负荷下性能恶劣、很难跟踪错误。
以太网的两种标准帧格式(大多数使用的是Ethernet II格式)
Ethernet_II的帧中各字段说明如下:
- DMAC(Destination MAC)是目的MAC地址。DMAC字段长度为6 个字节,标识帧的接收者。
- SMAC(Source MAC)是源MAC地址。SMAC字段长度为6个字节 ,标识帧的发送者。
- 类型字段(Type)用于标识数据字段中包含的高层协议,该字段长度为2个字节。类型字段取值为0x0800的帧代表IP协议帧;类型字 段取值为0806的帧代表ARP协议帧。
- 数据字段(Data)是网络层数据,最小长度必须为46字节以保证帧长至少为64字节,数据字段的最大长度为1500字节。
- 循环冗余校验字段(FCS)提供了一种错误检测机制。该字段长度为4个字节。
3. 集线器、交换机、路由器的作用,以及所属的网络层。
(1)集线器(第一层 物理层)
它的作用可以简单的理解为将一些机器连接起来组成一个局域网
(2)交换机(第二层 数据链路层)
作用与集线器大体相同。但是两者在性能上有区别:集线器采用的式共享带宽的工作方式,而交换机是独享带宽,能够隔离冲突域。这样在机器很多或数据量很大时,交换机的性能会更好。
(3)路由器(第三层 网络层)
它的作用在于连接不同的网段并且找到网络中数据传输最合适的路径 ,可以说一般情况下个人用户需求不大。路由器是产生于交换机之后,就像交换机产生于集线器之后,所以路由器与交换机也有一定联系,并不是完全独立的两种设备。路由器主要克服了交换机不能路由转发数据包的不足。
- 目前主要使用交换机和路由器的组合使用
4. IP 数据数据报常见字段的作用。
(1)0100 = Version : 4(表示使用的 IPv4协议),对等层之间要使用同一种IP协议(IPv4协议); (2)0101 = Header Length : 20Bytes(5) 首部长度占4 bit ,可表示的最大数值为15个单位(1111),一个单位一个字节,最大为60字节; (3)服务类型-占8 bit ,(Differentiated Services Field)字段来区分服务,Delay = 1 延迟小,Throughput = 1吞吐量大,Reliability = 1 质量比较高,Cost = 1 最小代价!同一时刻只有一位是1; (4)Total Length 总长度占 16 bit:2^16 - 1 = 65535 字节,值首部和数据之和的长度,单位为字节,因此数据报的最大长度为65535字节(MTU最大传送单元); (5)标识(identification)占16 bit,它是一个计数器,用来产生数据包的标识; (6)标志(flag):数据包在传输的过程中,标志字段MF(More Fregment),MF = 1表示后面还有分片,MF = 0 表示最后一个分片; (7)片偏移:每个数据片不同时传输,标志着谋片在原分组中的相对偏移位置,以8字节为偏移单位; (8)生存时间(Time To Live)占用 8bit ,使用“跳数“作为TTL的单位。数据报每经历一个路由器时对应的TTL值就会减 1 ;防止数据报发送在路由器中出现环路,因为数据报在传送的过程中要占用一定的带宽(TTL值为零自动丢弃); (9)协议(8bit)字段指出此数据报所携带上层数据使用的TCP协议还是UDP协议,以便对等层接收到数据报交给上层相应的协议(TCP或者UDP协议)进行处理; (10)首部检验和(Header checksum 16bit)字段只校验数据报的首部,不包含数据部分;看IP数据报头部是否被破坏、被篡改和丢失等; (11)源地址:数据向外发送,发送机器本身的IP地址,也成为逻辑地址; (12)目的地址:数据具体要发送目标及其的IP地址。
5. ARP 协议的作用,以及维护 ARP 缓存的过程。
(1)什么是ARP?
ARP (Address Resolution Protocol) 是个地址解析协议。最直白的说法是:在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址
(2)ARP的作用?
OSI 模式把网络工作分为七层,彼此不直接打交道,只通过接口(layre interface). IP地址在第三层, MAC地址在第二层。 协议在发生数据包时,首先要封装第三层 (IP地址)和第二层 (MAC地址)的报头, 但协议只知道目的节点的IP地址,不知道其物理地址,又不能跨第二、三层,所以得用ARP的服务。
- 获得目的主机的硬件地址
(3)ARP缓存过程?
(1)ARP进程在本局域网上广播一个ARP请求分组。ARP请求分组的主要内容是表明:我的IP地址是192.168.0.2,我的硬件地址是00-00-C0-15-AD-18.我想知道IP地址为192.168.0.4的主机的硬件地址。
(2)在本局域网上的所有主机上运行的ARP进行都收到此ARP请求分组。
(3)主机B在ARP请求分组中见到自己的IP地址,就向主机A发送ARP响应分组,并写入自己的硬件地址。其余的所有主机都不理睬这个ARP请求分组。ARP响应分组的主要内容是表明:“我的IP地址是192.168.0.4,我的硬件地址是08-00-2B-00-EE-AA”,请注意:虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。
(4)主机A收到主机B的ARP响应分组后,就在其ARP高速缓冲表中写入主机B的IP地址到硬件地址的映射。
6. ICMP 报文种类以及作用;和 IP 数据报的关系;Ping 和 Traceroute 的具体原理。
(1)ICMP 报文种类
(2) 和IP协议的关系
ICMP 协议是 IP 协议的一部分。实际上 ICMP 协议是在 IP 协议基础上实现的。
(3)ping的原理( 分组网际探测(Packet InterNet Groper, PING) )
其中,回显请求的类型值是 8, 回显应答的类型值是 0。其对应的代码值都为 0。 标识符和序列号用于匹配回显应答和回显请求。有效负载可能包括一个表示传输时间的时间戳和一个序列号,这允许 PING 以无状态的方式计算往返时间(Round Trip Time, RTT),而不需要记录每个包的传输时间。
(4)Traceroute程序原理
- Traceroute程序可以让我们看到IP数据报从以太主机传到另外一台主机所经过的路由。
Traceroute程序使用ICMP报文和和IP首部中的TTL字段(生存周期)。 当路由器收到一份IP数据报,如果TTL字段是0或者1,则路由器不转发该数据报(接收到这种数据报的目的主机可以将它交给应用程序,这是因为不需要转发该数据报。但是,在通常情况下系统不应该接收TTL字段为0的数据报)。通常情况下是,路由器将该数据报丢弃,并给信源主机发送一份ICMP超时信息。Tracerouter程序的关键在于,这份ICMP超时信息包含了该路由器的地址。
那么,Tracerouter就通过发送一份TTL字段为1的IP数据报给目的主机。处理这份数据报的第一个路由器将TTL值减去1,丢弃该数据报,并回发一份超时ICMP报文。这样就得到了该路径中的第一个路由器的IP地址。然后Tracerouter发送一份TTL为2的数据报,这样就得到了第二个路由器的IP地址。那么,继续这个过程,直到达到目的主机。即使目的主机接收到一份TTL值为1的数据报也不会丢弃该数据报并产生一份ICMP报文,因为已经到达最终目的地。这个时候,Tracerouter程序发送一份UDP数据报给目的主机,但选择一个不可能的值作为目的端口号(大于30000),使得目的主机的任何一个程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的UDP模块产生一份“端口不可达”错误的ICMP报文,这样Tracerouter程序要做的就是区分搜到的ICMP报文是是超时还是端口不可达,以判断什么时候结束。