TCP/IP协议详解

TCP/IP协议一直困扰着我,特别后悔大学时期没有好好听计算机网络课程,上班之后只能狂补这些基础知识,最近把计算机网络基础知识啃了一遍,下面写出自己最近学习的知识吧。

网络协议

   TCP/IP翻译成中文就是传输控制协议/因特网互联协议,这个家族里面有很多知名协议例如HTTP,HTTPS,FTP,UDP,ARP等。TCP/IP是当前流行的网络传输协议框架,从严格意义上来说是一个协议族。因为TCP、IP是其中最为核心的协议,所以才把该协议族称为TCP/IP。在计算机网络技术一书中提到过ISO/OSI的七层传输协议,我记得大学那会考试还考过,不过他现在已经被淘汰了,这里就不在说了,有兴趣的可以查一下。

   说到TCP/IP就不得不提一下经典的TCP/IP协议分层框架,下面就是TCP分层框架图

TCP/IP协议详解_第1张图片

咱们从下向上说

链路层:链路层以字节为单位把0和1进行分组,定义数据帧,写入源和目标机器的物理地址、数据、校验位来传输数据。下面是以太网的帧协议

TCP/IP协议详解_第2张图片

MAC地址长6个字节共48位,通常使用十六进制数表示。在linux系统下面使用ifconfig -a命令即可看到MAC地址。其前24位由管理机构统一分配,后24位由厂商自己分配,保证网卡全球唯一,说白了,网卡就像家庭地址一样,是计算机世界范围内的唯一标识。

网络层:根据IP定义网络地址,区分网段。子网根据地址协议解析(ARP)进行MAC寻址,子网外进行路由转发数据包,这个数据包就是IP数据包。

传输层:数据包通过网络层发送到目标计算机后,应用程序在传输层定义逻辑端口,确认身份后,将数据包交给应用程序,实现端口到端口的通信。最经典的传输层协议就是TCP和UDP。UDP只是在IP数据包上增加端口等部分信息,是面向无连接的。是不可靠传输,多用于视频通信,电话会议等。与之相反,TCP是面向链接的。什么叫做面向链接呢,其实就是一种端到端通过失败重传机制建立的可靠传输方式,给人的感觉是有一种固定的通路承载着数据的可靠传输。

应用层:传出层的数据到达应用程序时,以一种统一规定的协议格式解读数据。例如邮件,E-mail在各个公司的程序界面操作、管理方式都不一样,但是都能够读取邮件内容,是因为SMTP协议就像传统的书信格式一样,按规定填写邮编和收件人信息。

总结来说,程序在发送消息时,应用层按照既定的协议打包数据,随后由传输层加上双方的端口号,由网络层加上双方的ip地址,由链路层加上双方的MAC地址,并且将数据拆分成数据帧,经过多个路由和网关后,到达目标机器。简单来说就是 端口->IP地址->MAC地址 这样的路径进行数据的封装和发送,解包的时候反过来即可。

下面介绍一下比较重要的一些协议

HTTP协议

       HTTP是一个属于应用层的面向对象的协议,由万维网协会(W3C)和Internet工作小组(Internet Engineering Task Force,IETF)于1990年合作开发。1997年前使用的是RFC1945中所定义的HTTP/1.0版本,1998年后使用的是其更新版本RFC2616,即HTTP/1.1版本。HTTP规定了Web客户端与Web服务器之间的报文交互方式,其报文中的每个字段都是一些ASCII字符串,而且各个字段的长度都是不固定的。

总体来说,HTTP具有以下几方面的特性:

(1)客户端/服务器(C/S)模式C/S模式是所有网络应用服务采用的通用模式。Web客户只需要使用支持HTTP的客户端程序(各种浏览器),就可以访问由不同Web服务器程序开发的Web网站。

(2)无连接这里所说的“无连接”是指在进行Web应用前无须建立专门的HTTP应用层会话连接,仅需要直接利用传输层已为它建立好的TCP传输连接即可,而像Telnet、SMTP、POP3这类应用协议,是面向连接的,除了需要传输层的TCP连接外,它们自己还要建立会话连接。

(3)高可靠性虽然HTTP本身是不可靠的无连接协议,但它使用了可靠的TCP传输层协议,在进行HTTP传输之前,已建立了可靠的TCP连接,因此,从数据传输角度来讲,HTTP的报文传输仍是可靠的。

(4)无状态这里所说“无状态”是指同一客户第二次访问同一Web服务器上的同一页面时,服务器给客户端的响应与第一次是一样的(当然,这是假设Web服务器上的对应页面没有更新),Web服务器不会记住这个客户端曾经访问过这个页面,而做出任何其他响应。

(5)简单快速客户端通过HTTP访问Web服务器时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST等(具体内容将在本章后面介绍),每种方法规定了客户端与服务器之间进行的事务处理和消息类型。由于HTTP简单,使得HTTP服务器的程序规模小,因而通信速度可以很快。

TCP协议

TCP是TCP/IP体系结构中最主要的传输层协议,在功能上与本章前面介绍的OSI网络中的TP4类传输层协议类似,但TCP只能提供面向连接的传输服务,而且TCP还具有以下主要特性:

(1)面向连接的传输协议也就是说,应用程序在使用TCP之前,必须先建立TCP传输连接,在传输数据完毕后,必须释放已建立的TCP传输连接。

(2)仅支持单播传输每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播(multicast)和广播(broadcast)传输方式。

(3)提供可靠的交付服务也就是说,通过TCP连接传送的数据可以无差错、不丢失、不重复,且按时序到达对端。

(4)传输单位为数据段TCP仍采用了传统的“数据段”作为数据传输单元。由于数据段大小受应用层传送的报文大小和所途经网络中MTU值大小决定,所以每次发送的TCP数据段大小是不固定的。在一个具体的网络中,有一个MSS(Maximum Segment Size,最大数据段大小),最小的数据段可能仅有21字节(其中20字节属TCP数据段头部,数据部分仅1字节)。

(5)仅一种TPDU格式TCP的数据传输数据单元称为“数据段”,其实也可以按照OSI/RM中的说法称为TPDU。在TCP中只有一种TPDU,而不会像OSI/RM中有很多种不同格式的TPDU(具体参见10.1.5节~10.1.7节),因为在TCP数据段头部已包括了各种TPDU所需的特征字段,主要是通过其中的多个控制位来实现的,具体将在说明TCP数据段格式时介绍。

(6)支持全双工传输TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有发送和缓存,用来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)。

(7)TCP连接是基于字节流的,而非报文流TCP不像UDP那样以一个个报文独立地进行传输,而是在不保留报文边界的情况下以字节流方式进行传输。

(8)每次发送的TCP数据段大小和数据段数都是可变的在TCP中,因为每次发送多少字节的数据不是固定的,也不是由主机当前可用缓存决定的,而是根据对方给出的窗口大小和当前网络的拥塞程度来决定的(本章后面将要介绍的UDP发送的报文长度是由应用进程给出的),所以每次可以发送的TCP数据大小是不固定的。

TCP的传输单元是数据段,数据段又是在应用层传送的数据基础上进行封装的,每次的TCP数据段大小取决于不同的应用进程数据。当然,如果应用层传送的报文太长,超出了MSS,则需要对报文进行分段,总的来说,每次传输的TCP数据段大小是由应用层数据和MSS双重决定的。

这样一来,每次可以发送的TCP数据段数也是不固定的,可以一次仅发送一个TCP数据段,也可以一次发送多个TCP数据段,只要在当前可用的“发送窗口大小”限制之内即可。另外,如果应用进程传送到TCP缓存中的数据太长,TCP可以对它进行分段,反之,如果传到TCP缓存中的数据太小,则TCP会等待缓存中有足够多的数据后再组装成一个数据段一起发送。

下面主要介绍一下面试中最爱问的也是很重要的点就是TCP的建立(三次握手)和释放(四次挥手)

TCP的建立

TCP是一个面向连接的传输层协议,因此,无论哪一方向的另一方发送数据,都必须先在双方之间建立一条传输连接。

我觉得搞清楚tcp建立之前应该先搞懂tcp有几种状态(借鉴《深入理解计算机网络》一书)

TCP/IP协议详解_第3张图片

1)首先是服务器初始化的过程,从CLOSED(关闭)状态开始通过顺序调用SOCKET、BIND、LISTEN和ACCEPT原语创建Socket套接字,进入LISTEN(监听)状态,等待客户端的TCP传输连接请求。

2)客户端最开始也是从CLOSED状态开始调用SOCKET原语创建新的Socket套接字,然后在需要再调用CONNECT原语时,向服务器发送一个将SYN字段置1(表示此为同步数据段)的数据段(假设初始序号为i),主动打开端口,进入SYN SENT(已发送连接请求,等待对方确认)状态。

3)服务器在收到来自客户端的SYN数据段后,返回一个SYN字段置1(表示此为同步数据段)、ACK字段置1(表示此为确认数据段)、ack(确认号)=i+1的应答数据段(假设初始序号为j),被动打开端口,进入到SYN RCVD(已收到一个连接请求,但未进行确认)状态。这里要注意的是,确认号是i+1,而不是i,表示服务器希望接收的下一下数据段序号为i+1。

4)客户端在收到来自服务器的SYN+ACK数据段后,向服务器发送一个ACK=1(表示此为确认数据段)、序号为i+1、ack=j+1的确认数据段,同时进入ESTABLISHED(连接建立)状态,建立单向连接。要注意的是,此时序号为i+1,确认号为j+1,表示客户端希望收到服务器的下一个数据段的序号为j+1。

5)服务器在收到客户端的ACK数据段后,进入ESTABLISHED状态,完成双向连接的建立。

TCP/IP协议详解_第4张图片

为什么需要三次握手而不是两次一次呢,这里可是试想一下,如果两次就建立了链接,如果有网络超时重复连接到情况就会出现脏链接情况,具体看下图,能看出每次建立链接能确认什么事情

在第二次连接的时候,服务端不知道自己发送报文对方能不能收到,同时自己是否发送成功自己也不清楚,需要对方去确认,对方确认你可以了你就可以了,TCP三次握手可以避免重复链接。

双方同时主动连接的TCP连接建立,会出现什么情况?

正常情况下,传输连接都是由一方主动发起的,但也有可能双方同时主动发起连接,此时就会发生连接碰撞,最终只有一个连接能够建立起来。所有连接都是由它们的端点进行标识的,如果第一个连接请求建立起一个由套接字(x,y)标识的连接,而第二个连接也建立了这样一个连接,那么在TCP实体内部只有一个套接字表项。

当出现同时发出连接请求时,两端几乎在同时发送一个SYN字段置1的数据段,并进入SYN_SENT状态。当每一端收到SYN数据段时,状态变为SYN_RCVD,同时它们都再发送SYN字段置1、ACK字段置1的数据段,对收到的SYN数据段进行确认。当双方都收到对方的SYN+ACK数据段后,便都进入ESTABLISHED状态。图10-40显示了这种同时发起连接的连接过程,但最终建立的是一个TCP连接,而不是两个,这点要特别注意

TCP/IP协议详解_第5张图片

从图10-40中可以看出,一个双方同时打开的传输连接需要交换4个数据段,比正常的传输连接建立所进行的三次握手多交换一个数据段。此外,要注意的是,此时没有将任何一端称为客户端或服务器,因为每一端既是客户端又是服务器。

你可能感兴趣的:(java基础知识)