首先,不了解不知道,TCP/IP这个经典的协议,比想象中要复杂许多,细究下去才知道,一本讲TCP/IP协议的书的厚度能够与数据结构书媲美了。html
TCP/IP协议,Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通信协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。编程
通俗来讲,TCP负责发现传输的问题,一有问题就发出信号,要求从新传输,直到全部数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址 来源:百度百科安全
如今的网络系统是分层的,理论上有OSI模型,工业界有TCP/IP协议簇。其对好比下:服务器
能够看出对于TCP/IP协议来讲,最主要的是这四个层:
连接层,网络层,传输层和应用层。网络
但首先,咱们须要知道TCP在网络OSI的七层模型中的第四层——Transport层,IP在第三层——Network层,ARP在第二层——Data Link层,在第二层上的数据,咱们叫Frame,在第三层上的数据叫Packet,第四层的数据叫Segment。数据结构
Data Link Layersocket
Network Link Layerui
Transport Layerspa
互联网的每一层,都定义了不少协议。这些协议的总称,就叫作"互联网协议"(Internet Protocol Suite)。它们是互联网的核心。.net
咱们在这里主要讨论TCP/IP协议
以访问Google为例:
TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。
IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。
以太网数据包的数据部分,最大长度为1500字节,而如今的IP数据包长度为5000字节。所以,IP数据包必须分割成四个包。由于每一个包都有本身的IP标头(20字节),因此四个包的IP数据包的长度分别为1500、1500、1500、560。
根据IP标头的序号,Google将四个包拼起来,取出完整的TCP数据包,而后读出里面的"HTTP请求",接着作出"HTTP响应",再用TCP协议发回来。
本机收到HTTP响应之后,就能够将网页显示出来,完成一次网络通讯。
握手?:即创建链接
挥手?:即断开链接
标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义:
(A)URG:紧急指针(urgent pointer)有效。 (B)ACK:确认序号有效。 (C)PSH:接收方应该尽快将这个报文交给应用层。 (D)RST:重置链接。 (E)SYN:发起一个新链接。 (F)FIN:释放一个链接。
对于这个,刚据说时,也感受很困惑,挥手,这里应该是放手(断开链接)的意思吧,握一次手,放一次手,因此不也应该是3次挥手嘛?且看细解:
所谓四次挥手(Four-Way Wavehand)即终止TCP链接,就是指断开一个TCP链接时,须要客户端和服务端总共发送4个包以确认链接的断开。
在socket编程中,这一过程由客户端或服务端任一方执行close来触发,整个流程以下图所示:
因为TCP链接时全双工的,所以,每一个方向都必需要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的链接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,可是在这个TCP链接上仍然可以发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另外一方则执行被动关闭,上图描述的便是如此。
同时发起主动关闭的状况:
此时,就能够回答困扰本身的问题啦:
这是由于服务端在LISTEN状态下,收到创建链接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭链接时,当收到对方的FIN报文时,仅仅表示对方再也不发送数据了可是还能接收数据,己方也未必所有数据都发送给对方了,因此己方能够当即close,也能够发送一些数据给对方后,再发送FIN报文给对方来表示赞成如今关闭链接,所以,己方ACK和FIN通常都会分开发送。因此就会出现确认方Ack=发起方Req+1。
通俗易懂深刻理解TCP协议(上):理论基础-网络编程/专项技术区 - 即时通信开发者社区!
互联网协议入门(一) - 阮一峰的网络日志
理论经典:TCP协议的3次握手与4次挥手过程详解-网络编程/专项技术区 - 即时通信开发者社区!