200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > tcp报文格式_面试必备TCP(一):三次握手

tcp报文格式_面试必备TCP(一):三次握手

时间:2018-10-02 03:50:10

相关推荐

tcp报文格式_面试必备TCP(一):三次握手

TCP大家都知道是什么东西,这个协议的具体报文格式如下:

标志位

URG:指示报文中有紧急数据,应尽快传送(相当于高优先级的数据)。PSH:为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。RST:TCP连接中出现严重差错(如主机崩溃),必须释放连接,在重新建立连接。FIN:发送端已完成数据传输,请求释放连接。SYN:处于TCP连接建立过程。 (Synchronize Sequence Numbers)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。

窗口

滑动窗口大小,这个字段是接收端用来告知发送端:自己还有多少缓冲区可以接受数据

发送端可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来(以此控制发送端发送数据的速率,从而达到流量控制)。窗口大小是一个16bit字段,因而窗口大小最大为65535。

头部长度(首部长度)

由于TCP首部包含一个长度可变的选项和填充部分,所以需要这么一个值来指定这个TCP报文段到底有多长。或者可以这么理解:就是表示TCP报文段中数据部分在整个TCP报文段中的位置。

该字段的单位是32位字,即:4个字节。TCP的滑动窗口大小实际上就是socket的接收缓冲区大小的字节数。

选项和填充部分

TCP报文的字段实现了TCP的功能,标识进程、对字节流拆分组装、差错控制、流量控制、建立和释放连接等。

其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,那么选项部分最长为:(2^4-1)*(32/8)-20=40字节。

三次握手

最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。

TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的**同部位SYN=1,同时选择一个初始序列号 seq=x **,此时,TCP客户端进程进入了SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

三次握手主要目的是:信息对等和防止超时

防止超时导致脏连接。如果使用的是两次握手建立连接,假设有这样一种场景:

客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文。

此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。