Franklinfang frankdevhub.site

TCP/IP协议详解

2019-11-06
Franklinfang

TCP/IP协议详解

什么是协议?

简单来说,协议就是计算机之间通过网络实现通信时事先达成的一种“约定”;这种“约定”使那些由不同厂商的设备,不同CPU及不同操作系统组成的计算机之间,只要遵循相同的协议就可以实现通信。TCP/IP通常被认为是一个四层协议,如图:

image

链路层:数据链路层或网络接口层,包括设备驱动程序和网络接口卡,它们一起处理与电缆的物理接口细节。

网络层:处理分组在网络中的活动,如分组的选路;网络层的协议包括IP协议、ICMP协议(Internet互联网控制报文协议)、IGMP协议(Internet组管理协议)。

传输层:主要为两台主机上的应用程序提供端到端的通信,包括TCP(传输控制协议)和UDP(用户数据报协议)。

应用层:处理特定的应用程序细节。

image

链路层的三个主要作用:

  • 1.为IP模块发送和接受IP数据;

  • 2.为ARP模块发送ARP请求和接受ARP应答;

  • 3.为RARP发送RARP请求和接受RARP应答。

TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的,所以开发者并不需要理解得十分透彻,只需要对TCP底层运作机制有一个大致理解即可,这一块有些复杂,先做个笔记,以后有需要,再做详细扩展

拓展:检测网络是否联通的命令——Ping

Ping的目的是为了测试另一台主机是否可达,该命令会发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答。 Ping程序还能测出到这台主机的往返时间,大多数的TCP/IP实现都在内核中直接支持Ping服务,这种服务器不是一个用户进程。Ping程序通过在ICMP报文数据中存放请求的时间值来计算往返时间。当应答返回时,用当前时间减去存放在ICMP报文中的时间值,既是往返时间。

什么是传输包?

将需要传输的数据分割为一个个小的单位进行传输的方法,就叫做包,如图:

image

通信过程中,每一个分组中都会附加上源主机地址和目标主机地址送给通信线路,这些发送端地址、接收端地址以及分组序号写入的部分就是“报文首部”;如果数据较大,分组过多,那么就有必要将分组序号写入包中,接收端会根据序号,分组按序重新装配为原始数据。(理解丢包就需要知道什么是包)

什么是“三次握手,四次挥手”?

TCP是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。该“连接”就是客户端和服务器的内存里保存的关于ip地址、端口号等对方的信息。TCP可以看成是一种字节流,它会处理IP层或以下的层的丢包、重复以及错误问题。在连接的建立过程中,双方需要交换一些连接的参数。这些参数可以放在TCP头部。

TCP提供了一种可靠、面向连接、字节流、传输层的服务,采用三次握手建立一个连接,采用4次挥手来关闭一个连接。

为什么要“三次握手,四次挥手”?

  • 1.所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。在socket编程中,客户端执行connect()时,将触发三次握手:即客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能明确自己和对方的收、发能力正常。

image

第一次握手:客户端发送网络包,服务端收到。服务端得出结论:客户端发送能力、服务端接收能力正常。

第二次握手:服务端发包,客户端收到。客户端得出结论:服务端接收、发送能力正常,客户端接收、发送能力正常。

第三次握手:客户端发包,服务端收到。服务端得出结论:客户端接收、发送能力正常,服务端发送、接收能力正常。 所以第一、二次握手,只是为了验证彼此的接收发送能力是否正常。经历上面的三次握手过程,客户端和服务端都确认了自己的接收、发送能力是正常的,就可以正常通信了。

  • 2.所谓四次挥手(four-way handshake),就是指TCP的连接的拆除过程需要发送四个包,客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

image

TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送或接收数据。客户端或者服务端皆可以主动发送指令告诉对方,我要关闭连接了,比如: 客户端:我要关闭连接了(客户端发起Close) 服务端:好,你关吧(服务端收到关闭指令,回了一个ACK)【此时客户端不可以向服务端传输数据,但是服务端仍然可以向客户端传输数据】 服务端:我传完所有数据啦(发送一个FIN段来关闭向客户端传输方向上的连接) 客户端:哦,好的,知道(发送ACK确认关闭连接)

注意:接收到FIN报文的一方只能回复一个ACK, 它是无法马上返回对方一个FIN报文段的,因为结束数据传输的“指令”是上层应用层给出的,它只负责“搬运”。


Similar Posts

Comments