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文件
host文件一个没有扩展名的系统文件,其做用就是用来存储一些经常使用的网络域名和与其对应的ip地址,当用户输入一个须要登陆的网址时,系统就会先去host文件中查找,若是找到了就当即打开该网址,若是找不到就去DNS域名解析服务器中查找。
参考文档:http://blog.csdn.net/imilli/article/details/50620104