【网络通讯】TCP/IP协议

01、文章目录

02、TCP/IP协议

人与人之间交流需要介质,这种介质我们统称为语言。
比如:美国人与美国人交流需要英文(English),中国人与中国人则是中文(Chinese).
既然如此,那么计算机与因特网呢?
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。

传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
互联网络与单个网络有很大的不同,因为互联网络的不同部分可能有截然不同的拓扑结构、带宽、延迟、数据包大小和其他参数。TCP的设计目标是能够动态地适应互联网络的这些特性,而且具备面对各种故障时的健壮性。

所谓协议(protocol),其实就是一个群体之间规定的规则,这个规则的目的是为了保证这个群体里面的人可以正常交流。还是回到计算机和网络的通信这边来举例。比如,
如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。

协议中存在各式各样的内容。从电缆的规格到 IP 地址的选定方法、寻找异地用户的方法、双方建立通信的顺序,以及 Web 页面显示需要处理的步骤,等等。

像这样把与互联网相关联的协议集合起来总称为 TCP/IP。也有说法认为,TCP/IP 是指 TCP 和 IP 这两种协议。还有一种说法认为,TCP/IP 是在 IP 协议的通信过程中,使用到的协议族的统称。

03、协议分类

【网络通讯】TCP/IP协议
看见这张图,可能有人会问,定义这么多协议干嘛,既然是规则,统一一下不就好了。
但是!
你有没有想过,为啥,每个国家都会有自己的语言,中文、英文、日文、等等。而不是通用英文来交流。
这里也许“存在即有意义”,可以很好的解释这个问题。
协议也是一样,不是说全部都规定为一种就方便了,有的时候东西表面复杂一点,内在就比较简单。这样对于用这个的人就会更加容易让人接受。
如果把全部东西都放在TCP/IP里面,是不是就很杂,很复杂。大概就是这么一个意思。

04、TCP/IP 协议模型图

七层OSI参考模型与TCP/IP协议四层网络模型如下:
【网络通讯】TCP/IP协议

【网络通讯】TCP/IP协议

TCP/IP各层的主要协议:
【网络通讯】TCP/IP协议

各层说明:

  • 应用层
    应用层决定了向用户提供应用服务时通信的活动。TCP/IP 协议族内预存了各类通用的应用服务。比如,FTP(FileTransfer Protocol,文件传输协议)和 DNS(Domain Name System,域名系统)服务就是其中两类。HTTP 协议也处于该层。
  • 传输层
    传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(Transmission ControlProtocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
  • 网络层(又名网络互连层)
    网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。
  • 链路层(又名数据链路层,网络接口层)
    用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。

05、TCP/IP三次握手与四次挥手

关于TCP/IP 三次握手四次挥手,在socket套接字那一文也曾提过,但是,没说清楚,今天好好说下,整理了一些网上的知识,算是比较清楚了。

【网络通讯】TCP/IP协议

①TCP是一种精致的,可靠的字节流协议。
②在TCP编程中,三路握手一般由客户端(Client)调用Connent函数发起。
③TCP3次握手后数据收发通道即打开(即建立了连接)。

上面图片中的流程都是套路,只要是TCP/IP,都会这样做,不同平台只是有一点细微的区别罢了。

5.1 三次握手

【网络通讯】TCP/IP协议
三次握手基于客户端的主动,响应与服务器的被动。下面请看:

  1. 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  2. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  3. 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
  4. 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攻击了。
    在Linux平台我们是可以通过#netstat -nap | grep SYN_RECV让之现型。

5.2 四次挥手

所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。

【网络通讯】TCP/IP协议
由于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.3 四次挥手面试备考

这个问题是我面了很多家公司,每次问到TCP/IP时基本都问了的问题,这里分享下!

为什么Client在最后一次挥手后要等待2MSL?

  1. 为了保证Client发送的最后一个报文段能到达Server。如果Server未收到最后一个报文,则Client重传一次确认,重新启动2MSL计时器。如果Client不等待2MSL,则无法收到Server重传的FIN+ACK报文段,因此也不会再次发送确认报文段,这样Server就无法正常进入关闭状态。
  2. 防止“已失效的连接请求报文段”处出现在本连接中。即等待2MSL后,可以使连接持续期间所产生的所有报文段都从网络中消失,这样可以使下一个新的连接中不会出现这种旧的连接请求报文段。

MSL: Maximum Segment Life Time,最长报文段寿命。RFC793建议设为2分钟,但这完全是从工程上考虑的,对于现在的网络,MSL=2分钟太长,所以TCP允许不同的实现可根据具体情况使用更小的MSL

06、有限状态机(图)

为了更清晰的看出TCP的各个状态,网上大佬绘制了如下图所示的状态机,客户端与服务端结合在一起,使过程更加清晰。

【网络通讯】TCP/IP协议

07、TCP/IP报文格式

【网络通讯】TCP/IP协议
格式说明:

  • 序号: 本报文段所发出的第一个字节的序号
  • 确认号:期望接收到对方下一个报文的第一个数据字节的序号
  • ACK:仅当ACK等于1时,确认字段才有效
  • SYN:在建立连接时用的同步序号。当SYN=1,ACK=0时,表示是连接请求报文段。若响应SYN=1,ACK=1,表示对方同意建立连接
  • FIN:用来释放一个链接
  • 窗口:从本报文首部的确认号开始,接收方允许对方发送的量
  • 紧急指针:当URG=1时有效。指出紧急数据末尾在报文中的位置

每一层都会加上层的首部作为标识,然后在下一层变为下一层的数据,下一层再次封装他的首部,层层下去,而解析则相反,过程一样,只不过是去掉首部,不再是加首部,最后就解析出真正的数据。

08、附录

图片来源网络,来自很多博客。这里就不一一粘贴出来了,内容也部分时参考博客。
贴上自己上一篇socket的博客地址:https://blog.****.net/m0_43458204/article/details/107392698

若上述内容有错误的地方,欢迎各位指出,交流交流。
版权声明:转载请注明出处,谢谢!