TCP简谈

大三时上过《计算机网络基础》专门课,那时是晚课,基本每个同学都在认真的发呆没有,突然以后又不搞网络这一块的东西,也参与了发呆的行列,只要考试通过就行了。后我发现,不管是我们是不是做软件开发,都会接触接触到计算机网络,尤其我是移动开发,更加多会接触到这个东西。平时生活中我们要接触到路由器,交换机,dns,ping,修改dns等等这些基本的操作,在某软学院的我已经是家常便饭了,作为软移动开发者,我们要接触到tcp、udp、http、tcp连接三次握手,断开四次挥手、socket等等这些专业点的知识,真心后悔为什么当时在发呆····

OSI

是Open System Interconnection的缩写,意为开放式系统互联。是设计和描述计算机网络通信的基本框架。OSI模型把网络通信的工作分为7层,分别是物理层数据链路层网络层传输层会话层表示层应用层。记忆方法物,数,网,传,会,表,应——》无数网传会表应,本人的记忆方法···别介意


物理层:通过媒介传输比特,确定机械及电气规范(比特Bit)

数据链路层:将比特组装成帧和点到点的传递(帧Frame)

网络层:负责数据包从源到宿的传递和网际互连(包PackeT)

传输层:提供端到端的可靠报文传递和错误恢复(段Segment)

会话层:建立、管理和终止会话(会话协议数据单元SPDU)

表示层:对数据进行翻译、加密和压缩(表示协议数据单元PPDU)

应用层:允许访问OSI环境的手段(应用协议数据单元APDU)



Http 

---->(HyperText Transfer Protocol、超文本传输协议)是OSI七层中应用层的协议。

HTTP 基于 TCP/IP协议的应用层协议。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口

(可简单来说就是http是应用层的,因为要写网址)HTTP协议基于TCP连接,然而TCP/IP是传输层协议,主要解决数据如何在网络中传输;

传输数据,可以只使用传输层(TCP/IP),但是没有应用层,便无法识别数据内容。如果要使得传输的数据有意义,必须使用应用层协议(HTTP、FTP、TELNET等),也可以自己定义应用层协议。

TPC/IP协议是传输层协议,主要解决数据 如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据,而且http协议就是建立在tcp/ip协议之上的。使用TCP协议是需要连接三次握手,断开连接三次挥手的。

HTTP 是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。但是使用Cookie和Session可以保存状态和识别。HTTP只能是由客户端发起,服务端是无法主动想客户端发送数据的

>WEB使用HTTP作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发送到网络上。

HTTP要是定义为协议那么http只是一种规定规则,规定了客户端的URI请求格式以及服务端数据响应格式,要说HTTP请求这个概念久比较笼统了,客户端发送一次HTTP请求,经过OSI的七层协议的组装、传输、拆分、传输等一些操作,最终可以获得我们想要的数据。

其实就是用来解决客户端和服务端的数据如何包装,包装两端最后得到的数据可以被识别。

这里可能就有同学问怎么又多了一个OSI七层,看好了 ——>OSI分层 (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。也就是刚上面数那7个东西

那么其实还有个5层协议,五层协议包括了:物理层、数据链路层、网络层、运输层、应用层。

其实还有个4层:TCP/IP分层(4层):网络接口层、网际层、运输层、应用层。

再来看图:


TCP

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。(可以说是安全一点)

用于:解决网络中的数据可以安全无错的传送

理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求 。但是缺点相对于UDP来说是比较慢的。

但是TCP有又是比较安全的:安全体现在哪儿?

连接安全:三次握手 四次挥手;

数据安全:TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

HTTP协议是基于TCP的,由于HTTP请求是一次请求一次应答,由于请求和应答都只有一次,所以就必须保证数据的安全性,在这一次的传送中不好丢失数据,所以HTTP是要基于更加安全的TCP协议而不是UDP协议,Socket连接可以基于TCP也可以基于UDP,看具体的业务的需求了。HTTP请求使用基于TCP的Socket连接

TCP发送的包有序号,对方收到包后要给一个反馈,如果超过一定时间还没收到反馈就自动执行超时重发,因此TCP最大的优点是可靠。一般网页(http)、邮件(SMTP)、远程连接(Telnet)、文件(FTP)传送就用TCP 。


TCP通过肯定的确认应答(ACK)实现可靠的数据传输。当发送端将数据发生之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大。

当然,在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。

未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,知识返回的确认应答在途中丢失。这种情况也会导致发送端因没有收到确认应答,而认为数据没有到达目的地,从而进行重新发送,如下图:


此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。此时,源发送主机只需重发数据即可,但是对目标主机,反复收到相同的数据,确是一种"灾难"。而为了对上层应用提供可靠的传输,必须得放弃重复的数据包。

为此,必须引入一种机制,它能够识别出是否已经接收数据,又能够判断是否需要接收。

上述这些确认应答处理、重发控制以及重复控制等功能都可以通过序列号实现。

序列号是按顺序给发送数据的每一个字节(8位字节)都标上号码的编号。

接收到查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序号作为确认应答返送回去。三次握手

TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。

为什么要三次握手

既然总结了TCP的三次握手,那为什么非要三次呢?怎么觉得两次就可以完成了。那TCP为什么非要进行三次连接呢?在谢希仁的《计算机网络》中是这样说的:“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。”

在书中同时举了一个例子,如下:

就是!防止了服务器端的一直等待而浪费资源。

四次挥手

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次挥手”。

在socket编程中,任何一方执行close()操作即可产生挥手操作。

为什么要四次挥手

那四次挥手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。


UDP

UDP (User Datagram Protocol,用户数据报协议)是OSI参考模型中无连接的传输层协议.解决网络中的数据可以高效的传送

UDP用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

OSI参考模型中传输协议只有TCP和UDP两种,TCP需要链接安全效率低,UDP无线连接不安全效率高,我们平时使用做多的HTTP协议基于TCP,很多语言都有HTTP请求的封装,用起来很方便,但是想使用UDP就没那么方便了,想使用UDP我们就需要自己去写一个Socket UDP了,Socket UDP不需要链接,客户端知道服务端的IP和端口号直接发送数据就可以了,Socket TCP由于需要链接所以使用的时候需要心跳机制来确保链接没有断开。

UDP一般用于多点通信和实时的数据业务,比如语音广播、视频、QQ、TFTP(简单文件传送)、SNMP(简单网络管理协议)、RTP(实时传送协议)RIP(路由信息协议,如报告股票市场,航空信息)、DNS(域名解释)。注重速度流畅。讲到底就是用速度快的~


总结一下:

TCP/UDP的区别:

TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的

UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

TCP首部开销20字节;UDP的首部开销小,只有8个字节

TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道



TCP的优点与缺点

优点:可靠,稳定  (三次握手)而且在数据传递时有确认、窗口、重传、拥塞控制机制,数据传完后断开连接节约系统资源

缺点:慢、效率低、占用系统资源比较高,容易被攻击 tcp在连接之前,要先建立连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制都会消耗大量的时间 ,而且每台计算机上维护所有的连接,都会占用大量的系统的cpu 内存等硬件资源。

UDP的优点与缺点

优点:快,相对安全  UDP 是一个无状态的传输协议,所以传输速度非常快

缺点:不可靠 不稳定


TCP提供面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。

TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报。

TCP注重数据安全性,UDP数据传输快,因为不需要连接等待,少了许多操作,但是其安全性却一般。




你可能感兴趣的:(TCP简谈)