TCP报文格式,TCP的三次握手和四次挥手&hosts文件

1.TCP报文格式服务器

TCP报头中的源端口号和目的端口号IP数据报中的源IP与目的IP惟一肯定一条TCP链接网络

序号(4字节=32):tcp

    37 59 56 75spa

    用来标识TCP发端向TCP收端发送的数据字节流.net

确认序号(4字节=32):计算机网络

    因为该报文为SYN报文,ACK标志为0,故没有确认序号(ACK标志为1时确认序号才有效)TCP协议规定,只有ACK=1时有效,也规定链接创建后全部发送的报文的ACK必须为1指针

    一旦链接创建,该值将始终发送(同ACK标志)blog

头部长度:该字段占用4位,用来表示报文首部的长度,单位是4Byte。如:headLen = ((packet[12]>>4)&0x0F)*4;ip

预留6位:长度为6位,做为保留字段,暂时没有什么用处。资源

 

URG:长1位,表示紧急指针字段有效;

ACK:长1位,置位表示确认号字段有效;TCP协议规定,只有ACK=1时有效,也规定链接创建后全部发送的报文的ACK必须为1

PSH:长1位,表示当前报文须要请求推(push)操做;

RST:长1位,置位表示复位TCP链接;

SYN:长1位,在链接创建时用来同步序号。当SYN=1而ACK=0时,代表这是一个链接请求报文。对方若赞成创建链接,则应在响应报文中使SYN=1和ACK=1. 所以,SYN置1就表示这是一个链接请求或链接接受报文。

FIN:长1位,用于释放TCP链接时标识发送方比特流结束即完,终结的意思用来释放一个链接。当 FIN = 1 时,代表此报文段的发送方的数据已经发送完毕并要求释放链接。

窗口大小:长度为16位,2个字节。

校验和:长度为16位,2个字节。

紧急指针:长度为16位,2个字节。

以上是TCP包头必需要有的字段,也称固有字段,长度为20个字节。

 

2.TCP三次握手

TCP怎样才能保证可靠的传输任务,就是经过三次握手

首先由Client发出请求链接即 SYN=1 ACK=0  (请看头字段的介绍), TCP规定SYN=1时不能携带数据,但要消耗一个序号,所以声明本身的序号是 seq=x

而后 Server 进行回复确认,即 SYN=1 ACK=1 seq=y, ack=x+1,

再而后 Client 再进行一次确认,但不用SYN 了,这时即为 ACK=1, seq=x+1, ack=y+1.

 

3.TCP四次挥手

  当客户A 没有东西要发送时就要释放 A 这边的链接,A会发送一个报文(没有数据),其中 FIN 设置为1,  服务器B收到后会给应用程序一个信,这时A那边的链接已经关闭,即A再也不发送信息(但仍可接收信息)。

  A收到B的确认后进入等待状态,等待B请求释放链接, B数据发送完成后就向A请求链接释放,也是用FIN=1 表示, 而且用 ack = u+1(如图), A收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。

为何要等待呢?

为了这种状况: B向A发送 FIN = 1 的释放链接请求,但这个报文丢失了, A没有接到不会发送确认信息B 超时会重传,这时A在 WAIT_TIME 还可以接收到这个请求,这时再回复一个确认就好了。(A收到 FIN = 1 的请求后 WAIT_TIME会从新记时)

另外服务器B存在一个保活状态,即若是A忽然故障死机了,那B那边的链接资源何时能释放呢?  就是保活时间到了后,B会发送探测信息, 以决定是否释放链接。

 注意:中断链接端能够是Client端,也能够是Server端。

来个通俗版的解释:

假设Client端发起中断链接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",可是若是你还有数据没有发送完成,则没必要急着关闭Socket,能够继续发送数据。因此你先发送ACK,"告诉Client端,你的请求我收到了,可是我还没准备好,请继续你等个人消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端肯定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭链接了"。Client端收到FIN报文后,"就知道能够关闭链接了,可是他仍是不相信网络,怕Server端不知道要关闭,因此发送ACK后进入TIME_WAIT状态,若是Server端没有收到ACK则能够重传。“,Server端收到ACK后,"就知道能够断开链接了"。Client端等待了2MSL后依然没有收到回复,则证实Server端已正常关闭,那好,我Client端也能够关闭链接了Ok,TCP链接就这样关闭了!(是服务端先关闭,后客户端关闭

【问题1】为何链接的时候是三次握手,关闭的时候倒是四次握手?
答:由于当Server端收到Client端的SYN链接请求报文后,能够直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。可是关闭链接时,当Server端收到FIN报文时,极可能并不会当即关闭SOCKET,因此只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端全部的报文都发送完了,我才能发送FIN报文,所以不能一块儿发送。故须要四步握手。

【问题2】为何TIME_WAIT状态须要通过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,咱们能够直接进入CLOSE状态了,可是咱们必须假象网络是不可靠的,有能够最后一个ACK丢失。因此TIME_WAIT状态就是用来重发可能丢失的ACK报文。

整个客户端所经历的状态:

整个服务端经历的状态:

栗子1:

TCP连接中主动断开连接netstat观察可能出现的状态流转是:CD

  A.ESTABLISHED->CLOSE_WAIT->TIME_WAIT->CLOSED

  B.ESTABLISHED->TIME_WAIT->CLOSE_WAIT->CLOSED

  C.ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

  D.ESTABLISHED->FIN_WAIT_1->TIME_WAIT->CLOSED

栗子2:

一条tcp链接,主动关闭的一方不可能出现的链接状态是()A

  A.CLOSE_WAIT

  B.FIN_WAIT2

  C.TIME_WAIT

  D.FIN_WAIT1

4.关于Host文件

hosts文件 是一个用于储存计算机网络中各节点信息的计算机文件。
这个文件负责将主机名称映射到相应的IP地址 。
hosts文件一般用于补充或取代网络中 DNS 的功能。
和DNS不一样的是,计算机的用户能够直接对hosts文件进行控制。

host文件一个没有扩展名的系统文件,其做用就是用来存储一些经常使用的网络域名和与其对应的ip地址,当用户输入一个须要登陆的网址时,系统就会先去host文件中查找,若是找到了就当即打开该网址,若是找不到就去DNS域名解析服务器中查找。

参考文档:http://blog.csdn.net/imilli/article/details/50620104

相关文章
相关标签/搜索