20

TCP/IP不是一个单独的协议

TCP/IP并不是单独的一个协议,而是一个协议族(TCP/IP协议族),这个协议中最核心的两个协议是TCP(传输控制协议)和IP(网际协议)。

TCP特点

TCP协议是面向连接的通讯协议
面向连接的会话的建立过程如下:
1.源应用程序请求一个面向连接的通信会话。
2.建立会话(需要一段时间,是选用无连接的协议的一个原因)。
3.在逻辑连接上开始数据传输。
4.传输结束时,信道解除连接。

简单的说面向连接的会话,就像打电话一样
1.我想要跟我妈打个电话。
2.我打过去了,我妈的手机开始响,截止到我妈接电话这个动作。
3.我跟我妈说:‘妈,我没钱了’。
4.我妈挂断电话。

其实在数据传输(我跟我妈说“我没钱了”)之前和之后有很多动作,包括“想打电话,打电话,接电话,挂电话”。
而建立TCP连接之前需要进行三次握手,而断开连接则需要四次挥手。这么麻烦,每次数据通讯的时候需要耗费的资源更多,这样做的好处就是比较可靠,哪怕你传输失败了,你也能知道--哦,我这次通讯失败了(跟UDP一个比较大的区别)。

tcp报头

clipboard.png

源端口和目标端口分别是本机的端口和请求服务器的端口,每个只能16位,所以你知道为啥端口只能65535个了吗,别找ip了,在ip报头里那
序号:客户端随机产生的一个值,长度为32位
确认号:是接受信息端,接受数据包之后,返回的时候把(序号+1)返回,这样发送端就知道:这个返回的确认号=我刚才发送的序号+1,所以这个数据是回复我的
数据偏移:tcp报首占了数据的X位,所以从开始往后数X位才是你的你需要的数据,此处的X就是数据偏移
保留:保留为今后使用,但目前应置为0
标志位:一共有6个,分别占1位,共6位

1.紧急 URG:它告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送
2.确认 ACK:当ACK=1的时候,确认号有效,建立连接之后所有的ack都应设置为1
3.推送 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 四次挥手释放连接的时候,就会用到该标志

窗口大小 Window Size:该字段明确指出了现在允许对方发送的数据量.
校验和 TCP Checksum:由发送端填充,接收端对 TCP 报文段执行 CRC 算法,以检验 TCP 报文段在传输过程中是否损坏,如果损坏这丢弃。
紧急指针 Urgent Pointer:仅在 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的ACK,就可以双双进入TIME_WAIT状态

三次握手四次挥手

图片描述
1.第一次握手:建立连接。客户端发送连接请求报文段,发送的SYN位置为1,序号(Sequence Number)为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
2.第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置确认号(Acknowledgment Number)为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,序号(Sequence Number)为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
3.第三次握手:客户端收到服务器的SYN+ACK报文段。然后将确认序号(Acknowledgment Number)设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
完成了三次握手,客户端和服务器端就可以开始传送数据

图片描述

1.第一次挥手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
2.第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求
3.第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态;
4.第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
至此,TCP的四次挥手就这么愉快的完成了

clipboard.png

图片描述
这个是两个通讯方同时发起结束的情况
1.主机A,设置Sequence Number和Acknowledgment Number,向主机B发送一个FIN报文段;此时,主机A进入FIN_WAIT_1状态;这表示主机A没有数据要发送给主机B了,于此同时第二部正在进行,接收到主机B发过来的申请断开连接的请求,进入CLOSING;
2.主机B,设置Sequence Number和Acknowledgment Number,向主机A发送一个FIN报文段;此时,主机B进入FIN_WAIT_1状态;这表示主机B没有数据要发送给主机A了,之后接收到主机A发过来的申请断开连接的请求,主机B也进入CLOSING
3主机A同意主机B提出的断开申请的要求,同时接受到主机B同意断开申请的要求,主机A状态变为TIME_WAIT
4--跟第三步一样

图片描述
widnows下抓包工具抓到的数据包和tpc报头的对应


寻觅
107 声望1 粉丝