TCP/IP不是一个单独的协议TCP/IP不是一个单独的协议,而是一个协议族(TCP/IPprotocolfamily),这个协议中的两个核心协议它们是TCP(传输控制协议)和IP(互联网协议)。TCP特点TCP协议是一种面向连接的通信协议。一个面向连接的会话的建立过程如下:1.源应用程序请求一个面向连接的通信会话。2.建立会话(需要一段时间,这是选择无连接协议的原因之一)。3.在逻辑连接上开始数据传输。4.传输结束时,通道断开。简单的说,面向连接的session就好比打电话1.我想给妈妈打电话。2、我打电话,妈妈的手机开始响,直到妈妈接电话。3.我跟妈妈说:‘妈妈,我没钱’。4.妈妈挂了电话。其实数据传输前后有很多动作(我跟妈妈说“我没钱”),包括“想打电话,打电话,接听,挂断”。TCP连接建立前需要三次握手,断开需要四次握手。好麻烦,每次数据通信都需要消耗更多的资源,这样做的好处是比较可靠,即使你传输失败了,你也可以知道——哦,我这次通信失败了(比UDP还大不同之处)。tcp头的源端口和目的端口分别是本机的端口和请求服务器的端口,每个只能有16位,那么你知道为什么只有65535个端口吗?不用找ip,ipheader中的序号:客户端随机生成的一个值,长度为32位。确认号:为接收端。收到数据包后,返回时会返回(序号+1),这样发送端就知道:返回的确认号=我刚才发送的序号+1,所以这个数据是对我的回复dataoffset:tcpreport先占数据的X位,所以从头开始的X位就是你需要的数据,这里的X是Dataoffsetreservation:预留以备后用,但应该设置为0现在。Flag:一共6个,每个占1,6个共1个。UrgentURG:告诉系统这个报文段有紧急数据,应该尽快发送,而不是按照原始排队顺序2.确认ACK:当ACK=1时,确认号有效,连接建立后的所有acks都要设置为13.推送PSH(Push):当PSH=1时,表示该段具有高优先级,接收方TCP应该尽快将其推送给接收方应用程序,而不是等到整个TCP缓冲区都满了才投递。4、重置RST(Reset):当RST=1时,表示TCP连接出现严重错误,需要释放连接,重新建立连接。5、同步SYN(SYNchronization):当SYN=1时,表示这是一个请求连接段。一般把带有SYN标志的TCP报文段称为“同步报文段”。TCP三次握手中的第一个消息是同步消息段,用于在建立连接时同步序号。如果对方同意建立连接,则应在响应报文段中使SYN=1,ACK=1。6、终止FIN(Finis):当FIN=1时,表示本段发送方的数据已经发送完毕,要求释放TCP连接。通常,携带FIN的片段被称为“末端片段”。当TCP挥手四次释放连接时会用到这个标志。报文段执行CRC算法检查TCP报文段在传输过程中是否损坏,如果损坏则丢弃。UrgentPointerUrgentPointer:仅当URG=1时才有意义,表示本段中紧急数据的字节数。当URG=1时,发送方TCP在本段数据的最前面插入紧急数据,紧急数据后面的数据仍然是正常数据。tcp连接端口状态LISTENING状态:监听(LISTENING)状态ESTABLISHED状态:连接建立。表示两台机器正在通信CLOSE_WAIT:对方主动关闭连接或者网络异常导致连接中断。这时候我们的状态就会变成CLOSE_WAIT。这时候我们需要调用close()让连接正确关闭。TIME_WAIT:我们主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TIME_WAIT状态的连接占用的资源不会被内核释放CLOSED:初始状态,表示没有连接TIME_WAIT:表示已经收到对方的FIN报文,并发送了ACK报文,并且可以在2MSL后返回CLOSED可用状态为CLOSING:当双方主动发送FIN,并且在收到对方发送的FIN之前收到对方发送的FIN,双方都进入CLOSING状态,只要收到对方发给自己的FIN和FIN的ACK,双方就可以进入TIME_WAIT状态。三次握手和四次挥手。1.第一次握手:建立连接。客户端发送连接请求报文段,发送的SYN位置为1,序号(SequenceNumber)为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;2、第二次握手:服务器收到SYN报文部分。服务器收到客户端的SYN报文段后,需要对SYN报文段进行确认,并将AcknowledgementNumber设置为x+1(SequenceNumber+1);同时需要自己发送SYN请求信息。SYN位置为1,序号(SequenceNumber)为y;服务器将上述所有信息放入一个报文段(即SYN+ACK报文段),一并发送给客户端,此时服务器进入SYN_RECV状态;3、第三次握手:客户端收到服务器的SYN+ACK报文段。然后将AcknowledgementNumber设置为y+1,向服务器发送一个ACK报文段。报文段发送完毕后,客户端和服务器都进入ESTABLISHED状态,完成TCP三次握手。完成三次握手后,client和server可以开始传输数据1。第一次挥手:host1(可以是client或server),设置SequenceNumber和AcknowledgementNumber,发送一个FIN给host2消息段;此时主机1进入FIN_WAIT_1状态;这意味着主机1没有数据要发送给主机2;2、第二次分手:主机2收到主机1发送的FIN报文段,返回给主机1一个ACK报文段,AcknowledgmentNumber为SequenceNumber加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1我“同意”你的关机请求3.第三次挥手:主机2向主机1发送FIN报文4.第四次挥手:主机1收到主机2发送的FIN报文段,发送ACK报文段到主机2,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段后,关闭连接;此时主机1在等待2MSL后仍然没有收到回复,证明服务器已经正常关闭,好了,主机1也可以关闭连接了。至此,TCP的四波就愉快的完成了图片描述。这是两个通信方同时发起端的情况1.主机A设置SequenceNumber和AcknowledgmentNumber,发送一个FIN报文段给主机B;此时主机A进入FIN_WAIT_1状态;这意味着主机A没有数据要发送给主机B,同时第二部分正在进行,收到主机B的断开连接请求并进入CLOSING;2、主机B,设置SequenceNumber和AcknowledgementNumber,发送一个FIN报文段给主机A;此时主机B进入FIN_WAIT_1状态;这意味着主机B没有数据要发送给主机A,然后收到主机A的请求打开连接请求,主机B也进入CLOSING3主机A同意主机B的断开连接申请,同时接受主机B请求断线申请,主机A状态变为TIME_WAIT4——同windows下第三步抓包工具抓包与tpc头的对应关系
