什么是tcp/ip协议
什么是tcp/ip协议?TCP的三次握手指的是什么,为什么一定要三次握手,而不是四次或者是两次?
tcp /IP是什么?
现如今的internet services可以说就是基于TCP/IP构建的。理解数据是如何通过network传输的,无论对你调试net IO的性能还是解决问题还是学习新的技术都是有很大助益的。本文将会全面的,尽力细致的通过内核及硬件中的数据流和控制流来介绍这方面的知识。
2.知识剖析
先来看看今天的主角
TCP/IP协议的四层结构
请看图例
OSI七层参考模型TCP/IP四层的关系
数据包说明:
IP层传输单位是IP分组,属于点到点的传输;TCP层传输单位是TCP报文段,属于端到端的传输
TCP/IP的关键特征
我们如何设计一个数据传输协议以便保证数据快速、有序、无误?TCP/IP正是为了这样的需求被创造的。下面的几个特征用于帮助了解什么是TCP/IP协议(栈)。由于对于TCP来讲IP是紧密相关的,我们放到一起介绍。更多的内容,大家可以参考大学教材《计算机网络》(谢希仁著)以及《TCP/IP协议》三卷(国外)。
面向连接的(Connection-oriented)
一个tcp connection有两个端(endpoint),每一个endpoint可以用一个***(ip、port)来表达,所以两端的话就可以用(local IP address, local port number, remote IP address, remote port number)***来表达。
数据是双向流动的
双向的传递二进制流。
按序传送的
接受者接收数据一定是会按照发送者发送数据的顺序的。通过一个32-bit integer做标记。通过ACK来保证可靠性,如果发送者收不到接受者的ACK,则会重新发送。
流量控制
发送方会根据接收方提供的的窗口大小来决定如何发送数据,不会超过接收方的缓冲能力。
拥塞控制
拥塞窗口(congestion window)区别于receive window,是发送方自己根据包ACK的状态结合特定的拥塞算法计算出的一个window。它表达的当前的网络状态。发送发发送的数据上限受到流量控制和拥塞控制共同的作用。
数据传送
数据接收流程图
Linux的TCP/IP层次结构和实现方式如图 1 所示。
TCP主要特点
1.面向面向连接的运输层协议。应用程序在使用 tcp协议 之前,要先建立tcp连接,数据传输完毕后,也要释放连接。
应用程序间的通信像是,通话前要先拨号建立连接,通话结束后要挂机释放连接。
2. 提供可靠交付。无差错,不丢失,不重复,并按序到达。
3.采用全双工通信。通信双方在任何时候都可以发送和接受数据,且通信双方都设有发送缓存和接受缓存,用来临时存放双向通信的数据。
4.面向字节流。应用程序交下来的是数据块,但tcp把他们看成是无结构无意义的字节流
3.常见问题
如何建立TCP/IP连接
到达目标地址的IP包如何检验完整性
4.解决方案
建立TCP/IP的过程就是要讲的三次握手。
即三次握手就是为了解决连接的问题
建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。
(1)第一次握手:Client将标志位 SYN 置为1,随机产生一个值seq=J,并将该数据包发送给 Server ,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
IP包有固定的报文格式,报头有所需要参数
如:源端口、目标端口、确认序号和标志域等。