TCP/IP协议族
TCP/IP协议是Internet最基本的协议。由传输层的TCP协议和网络层的IP协议组成。
TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。
TCP/IP协议族的分层管理
TCP/IP协议族按层次分别分为以下4层:应用层、传输层、网络层和数据链路层。
应用层
应用层决定了向用户提供应该服务时通信的活动。
TCP/IP协议族内预存了各类通用的应用服务。比如,FTP(File Transfer Protocol,文件传输协议)和DNS(Domain Name System,域名系统)服务就是其中的两类。HTTP协议也处于该层。
传输层
传输层对上层应用层,提供处于网络连接中两台计算机之间的数据传输。
在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
网络层(又名网络互连层)
网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。
与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的所用就是在众多的选项内选择一条传输路线。
链路层(又名数据链路层,网络接口层)
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。
简单归纳下各层的协议:
TCP/IP通信传输
UDP协议:
详见维基百科:https://zh.wikipedia.org/wiki/用户数据报协议
UDP(User Datagram Protocol)即用户数据报协议,,是一个简单的面向数据报的传输层协议,正式规范为RFC 768。
在TCP/IP模型中,UDP为网络层以上和应用层以下提供了一个简单的接口。UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,不保留数据备份。
UDP报文结构:
优点——快。 缺点——不可靠、不稳定。
UDP:无连接,发送数据之前不需要建立连接(TCP需要)。减少了开销和延时。
UDP:面向报文,对IP数据报只做简单封装(8字节UDP报头)。减少报头开销。
UDP:没有阻塞机制,宁愿阻塞时丢弃数据不传,也不阻塞造成延时。
UDP支持一对一、一对多、多对一、多对多通信。
UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。
UDP协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP。
TCP协议:
详见维基百科:https://zh.wikipedia.org/wiki/传输控制协议
TCP(Transmission Control Protocol)传输控制协议,相对于UDP,TCP是面向连接的、提供可靠的数据传输服务。同时也是较UDP开销较大的、传输速度较慢的。
区别:
UDP:单个数据报,不用建立连接,简单,不可靠,会丢包,会乱序;
TCP:流式,需要建立连接,复杂,可靠 ,有序。
TCP报文结构:
TCP是点对点的连接。一条TCP连接只能连接两个端点。
TCP 提供可靠传输,无差错、不丢失、不重复、按顺序。
TCP 提供全双工通信,允许通信双方任何时候都能发送数据,发送方设有发送缓存,接收方设有接收缓存。
TCP 面向字节流 。TCP 并不知道所传输的数据的含义,仅把数据看作一连串的字节序列,它也不保证接收方收到的数据块和发送方发出的数据块具有大小对应关系。
TCP的协议:FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)、POP3(和SMTP相对,用于接收邮件)、HTTP协议等。
TCP提供可靠的、面向连接的数据传输服务。使用TCP通信之前,需要进行“三次握手”建立连接,通信结束后还要使用“四次挥手”断开连接。
TCP协议的三次握手和四次挥手:
注:seq:(Sequence Number):本报文段数据的第一个字节的序号
ack:(Acknowledgment Number):确认号——期望收到对方下个报文段的第一个数据字节的序号
SYN(synchronize):请求同步标志——用于建立和释放连接,当SYN=1时,表示建立连接。
ACK(acknowledge):确认标志——仅当 ACK=1时确认号字段才有效。建立 TCP 连接后,所有报文段都必须把 ACK 字段置为 1。
FIN(Finally):结束标志——用于释放连接,当 FIN=1,表明发送方已经发送完毕,要求释放TCP连接。
三次握手流程
1、第一次握手:客户端向服务器端发送连接请求包SYN=1(seq=x),等待服务器回应;
2、第二次握手:服务器端收到请求包后,将客户端的请求包SYN=1(seq=x)放入到自己的未连接队列,此时服务器需要发送两个包给客户端:
(1)向客户端发送确认自己收到其连接请求的确认包ACK=1(ack=x+1),向客户端表明已知道了其连接请求
(2)向客户端发送连接询问请求包SYN=1(seq=y),询问客户端是否已经准备好建立连接,进行数据通信;
此时服务器进入SYN_RECV状态。
3、第三次握手:客户端收到服务器的包后,知道服务器同意建立连接;向服务器发送连接建立的确认包ACK=1(ack=y+1),回应服务器的SYN(seq=y)告诉服务器,我们之间已经建立了连接,可以进行数据通信。
ACK=1(ack=y+1)包发送完毕,服务器收到后,此时服务器与客户端进入ESTABLISHED状态,开始进行数据传送。
为什么要三次握手?
握手的过程实际上是在通知对方自己的初始化序号(Initial Sequence Number),简称ISN,也就是上图中的x和y。x和y会被当作之后传输数据的一个依据,以保证TCP报文在传输过程中不会混乱。
解决两个问题:
1、避免连接请求的数据包丢失
假设连接途中,客户端网络不稳定出现丢包,服务端根据seq=x来确定客户端请求到第几个包。然后告诉客户端你从第seq=x个包开始发送给我,之前的不用发送了,我这里有记录了。
2、数据传输过程因为网络并发量很大在某结点被阻塞
传输过程因为网络并发量很大在某结点被阻塞了,Server端将先后收到2次请求,并持续等待两个Client请求向他发送数据,但是Cient端实际上只有一次请求,而Server端却有2个响应,极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待,因而造成极大的资源浪费!
三次握手的seq与ack确定了包的顺序。客户端每次请求时,询问服务端说这是第一号包,服务端收到后告诉客服端下次你给我的只能是二号包(别的都不要),同时给返回到客户端的包作标记:这是我返回给你的一号包。这样,出现阻塞时,根据包的序号就知道要响应的是几号包。
四次挥手流程
(1)Client向Server发送断开连接请求的报文段,seq=m(m为Client最后一次向Server发送报文段的最后一个字节序号加1),Client进入FIN-WAIT-1状态。
(2)Server收到断开报文段后,向Client发送确认报文段,seq=n(n为Server最后一次向Client发送报文段的最后一个字节序号加1),ack=m+1,Server进入CLOSE-WAIT状态。此时这个TCP连接处于半开半闭状态,Server发送数据的话,Client仍然可以接收到。
(3)Server向Client发送断开确认报文段,seq=u(u为半开半闭状态下Server最后一次向Client发送报文段的最后一个字节序号加1),ack=m+1,Server进入LAST-ACK状态。
(4)Client收到Server的断开确认报文段后,向Server发送确认断开报文,seq=m+1,ack=u+1,Client进入TIME-WAIT状态。
(5)Server收到Client的确认断开报文,进入CLOSED状态,断开了TCP连接。
(6)Client在TIME-WAIT状态等待一段时间(时间为2*MSL((Maximum Segment Life)),确认Client向Server发送的最后一次断开确认到达(如果没有到达,Server会重发步骤(3)中的断开确认报文段给Client,告诉Client你的最后一次确认断开没有收到)。如果Client在TIME-WAIT过程中没有再次收到Server的报文段,就进入CLOSES状态。TCP连接至此断开。
为什么要四次挥手?
tcp关闭连接需要四次握手原因:TCP连接是全双工通道,需要双向关闭。
client向server发送关闭请求,表示client不再发送数据,server响应。此时server端仍然可以向client发送数据,待server端发送数据结束后,就向client发送关闭请求,然后client确认。