TCP/IP协议

最近重新学习了计算机网络原理这一门课,趁着这机会,也对TCP/IP做一下总结吧。

一、 计算机网络体系结构分层

avatar

OSI模型和TCP/IP模型上有一些区别,每一层都是处理自己的事情,然后交给下一层处理。

二、 TCP/IP协议

互联网协议套件(Internet Protocol Suite,IPS)是一个网络通讯模型,以及整个网络传输协议家族,为网际网络的基础通讯架构。它通常被称为TCP/IP协议族(TCP/IP Protocols),简称TCP/IP

TCP(传输控制协议)和IP(网际协议)是最先定义的两个核心协议,所以才统称为TCP/IP协议族

三、 分层

TCP/IP协议族中有一个很重要一点就是分层管理,依次为以下四层,应用层,传输层,网络层,数据链路层(也有叫网络接口层/网际层)。应用层和传输层是计算机处理的,而下面两层则是通讯设备负责。

avatar

TCP/IP分层管理是有好处的,假如互联网只有一个协议统筹,某一个地方改变设计时,就需要把所有部分都替换掉,而分层只需要把变动的层替换掉即可。

四、 应用层

应用层是网络相关的程序为了通过网络与其他程序通信所使用的层。这个层的处理过程是应用特有的;数据从网络相关的程序以这种应用内部使用的格式进行传送,然后被编码成标准协议的格式。
例如我们所熟悉的:

  • HTTP(万维网服务)
  • FTP(文件传输)
  • SMTP(电子邮件)
  • SSH(安全远程登陆)
  • DNS(名称<-> IP地址寻找,域名系统)

应用层将数据编码成一个标准的应用层协议,然后将它传送到下一层(传输层)

五、 传输层

TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP。

特点 TCP UDP
是否连接 面向连接 无连接
是否可靠 可靠传输,使用流量控制和拥塞控制 不可靠传输,不使用流量控制和拥塞控制
传输方式 面向字节流 面向报文
首部开销 首部最小20字节,最大60字节 首部开销小,仅8字节
场景 适用于要求可靠传输的应用,例如文件传输 适用于实时应用(IP电话、视频会议、直播等)

1.端口号

数据链路和 IP 中的地址,分别指的是 MAC 地址和 IP 地址。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。

根据端口号识别应用程序
一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。

avatar

根据IP 地址、端口号、协议号进行通信识别
仅凭目标端口号识别某一个通信是远远不够的,所有还需要IP地址等,如:

avatar

avatar

2.端口号的确认

传输层端口号为16位整数。

  • 熟知端口号: 0~1023
  • 登记端口号: 1024~49151
  • 客户端口号/短暂端口号: 49152~65535

3.UDP

UDP是无连接服务,在数据传输之前无需与对端进行任何信息交换(握手),直接构造传输层报文段并向接收端发送。类似于邮政系统的信件通信,邮寄信件之前无需跟收件人交换任何信息,写好信件后直接交给投递员就好了。

4.TCP

TCP是面向连接服务,在数据传输之前需要双方交换一些控制信息,建立逻辑连接,然后再传输数据,数据传输结束后还需要再拆除连接。类似于电话通讯,必须首先拨号,建立电话连接,对方接起电话后,才可以进行语音交互通信,通信结束后还需要挂断电话拆除连接。

5.复用与分解

众多应用程序公用一个传输层协议,并能够实现将接收到的数据准确交互给不同的应用进程,要实现这一基本功能,称为传输层的多路复用和多路分解。

一个网络应用程序通过一个或多个套接字,实现与传输层之间的数据传递。因此,在接收主机中的传输层实际上并没有直接将数据交付给进程,而是先将数据交付给了与接收进程相关联的一个中间套接字,每个套接字都必须有唯一的标识符。这样传输层协议才能将数据交付给正确的套接字。

下面是UDP和TCP套接字的区别:

avatar

avatar

6.TCP报文结构

TCP报文段由首部字段和一个数据字段组成,而报文是有限制大小的,当TCP发送一个大文件时,通常会把该文件划分为长度为MSS(最大报文长度,Maximum Segment Size)的若干块,每个数据封装了一个TCP报文分别发送,报文结构如下:

avatar

序列号SEQ和确认号ACK
TCP网络中,为了保障每个连接提供有保证和有序的字节传递,使用了Sequence Number (,序列号)和 Acknowledgment Number(确认号),即seqack

  • seq表示每次传输中字节的偏移量。
  • ack表示期望下一次接收的seq是多少。

同步序列号SYN
SYN=1时,表示该TCP报文段是一个建立新连接请求控制段或者是同意建立新连接的确认段(此时ACK=1)。

FIN
FIN用来释放一个TCP连接,当FIN=1时,表明改TCP报文段的发送端数据已发送完毕,并请求释放连接。

7.TCP三次握手

avatar

8.TCP四次挥手

avatar

9.总结

对于复杂的网络,TCP的实现提出了很多应对措施,其中包括为什么要三次握手和四次挥手,以及TIME_WAIT状态有什么作用。

为什么要三次握手,不是两次
  • 为了实现可靠数据传输,通讯双方必须都维护一个序列号,用来标识发送出去的数据包中哪些被对方接收。三次握手的过程即是通讯双方相互告知序列号的起始值,并确认对方已经收到了序列号起始值。
  • 如果只有两次握手的话,最多只有客户端的起始序号被确认,而服务端的序列号得不到确认。
四次挥手 TIME_WAIT

从图中我们可以看到当客户端断开连接后最后会进入TIME_WAIT状态,那么保持这个状态有什么作用呢?

  • 在四次挥手中,客户端发送FIN,服务端接收后返回ACK确认,在确认所有数据发送完毕后会,再次发送FIN给客户端,客户端响应发送ACK并进入TIME_WAIT状态,等待2MSL最大分段寿命(MSL, Maximum Segment Lifetime)后关闭连接。
    如果没有TIME_WAIT状态,客户端响应的ACK包丢失的话,服务端就会重发FIN包,当客户端接收到一个没有经过TCP连接的包时,会响应一个RST重置包,导致服务端异常。所以TIME_WAIT是为了保证TCP的正常关闭。
  • 我们还知道,TCP报文传输过程中有可能不是顺序到达的,如果连接已经关闭了,此时客户端接收到了由于网络原因导致没有及时接收到服务端发送的数据包,客户端就会重新建立一个连接。所以TIME_WAIT的存在也是为了保证网络中迷失的数据包正常过期。
  • 为何一定要等2MSL?
    • 如果不等,释放的端口可能会重连刚断开的服务器端口,这样依然存活在网络里的老的TCP报文可能与新TCP连接报文冲突,造成数据冲突。