美文网首页
回忆TCP协议

回忆TCP协议

作者: sunpy | 来源:发表于2018-09-04 11:39 被阅读12次

    题外话

    毕业两年了,回不去的大学课堂,回想大学的计算机网络课,老师动态ppt演示的传输层的三次握手,超时重传等,真的好多已经忘了,今天稍微回顾下,有时间再把TCP的慢开始控制拥塞窗口的算法想想。

    什么是TCP

    我们知道UDP是一种无连接通信的协议。没有保证可靠传输等复杂的控制。而TCP本身是一种面向有连接的协议,也就是说必须确认对方存在时才能发送数据而TCP通过检验和、序列号、确认应答、重发控制、连接管理、窗口控制等机制来实现可靠传输。

    TCP协议的特点

    1. TCP是面向连接的运输层协议。
    2. 每一条TCP连接只能有两个端点,就是每一条TCP连接都只能是点对点的连接。
    3. TCP提供可靠交付的服务。
    4. TCP提供全双工通信。就是双方的进程可以在任何时候发送数据。
    5. 面向字节流。

    TCP报文段首部格式

    1.jpg
    1. 源端口:表示发送端口号占16比特(2字节)。
    2. 目的端口:表示接收端口号占16比特(2字节)。
    3. 序号:表示发送数据的位置占32比特(4字节);就是每次发送要把上次发送的字节数加上。注意虽然建立连接发送SYN包和断开连接发送FIN包不携带数据,但是也要加上1个字节的序号。
    4. 确认号: 指下一次收到对方的数据的序号。举例:B正确收到A发送的一个报文段,序号值为500,数据长度为200字节,B正确收到A发送的序号700的位置的数据。然后B发送给A的确认号为701。
      捎带技术:确认号为N,那么到序号N-1为止的所有数据都已正确收到。
    5. 数据偏移:就是TCP报文段的数据起始处距离TCP报文段的起始处有多远。占4比特。
    6. 保留:长度占4位,一般设置为0。
    7. 控制位:占8位;
      CWR,占1位,拥塞窗口减少标识,发送方设置,用于表明它收到了ECE标识的TCP包,发送端通过降低发送窗口的大小来降低速率。
      ECN,占1位,用于TCP3次握手时表示一个TCP端是具备ECN功能的。
      URG,占1位,该标志位表示紧急标识有效。
      ACK,占1位,表示Acknowledgment Number字段有效,这是一个确认的TCP包,0表示不是确认包。
      PSH,占1位,该标志位设置时一般表示发送端缓存中已经没有待发送的数据,接收端不将该数据进行队列处理。
      RST,占1位,用于复位相应的TCP链接。
      SYN,占1位,该标志仅在三次握手建立TCP连接时有效。
      FIN,占1位,带有该标志位的数据包用来结束一个TCP会话,但对应端口仍处于开放状态,准备接收后续数。
    8. 窗口大小:占2个字节,窗口值就是告诉对方从报文段首部中的确认号算起,接收方目前允许对方发送的数据量。窗口值说明是一个动态变化的值。
    9. 检验和:占2字节,检验和检查首部和字段两个部分,就是接收端的值必须要保证和发送端计算的值一样,不然就丢包。
    10. 紧急指针:占2字节,紧急指针指出了紧急数据的末尾在报文段的位置。注意紧急指针在URG=1时才有效。
    11. 选项:长度可变,但必须是32bits的整数倍,常见的选项包括MSS、SACK、Timestamp等。

    三次握手建立连接

    TCP三次握手其实就是TCP连接建立的过程,三次握手的目的是同步连接双方的各自发送的序列号和接收确认号并交换TCP窗口大小信息。

    网上找了张计算机网络书的图:


    2.jpg

    服务器B的进程创建传输控制块TCB,等待接收连接请求,进程处于收听状态。客户端A的进程也是创建传输控制块TCB,向B发送连接请求。①首部字段同步位SYN=1,初始序号seq=x。虽然第一次建立连接不携带数据,但是也要消耗一个字节的序号。然后A客户进程进入SYN-SENT(同步已发送)状态。
    ② B收到连接请求报文后,同意建立连接,那么向A发送确认。首部字段同步位SYN=1,确认位ACK=1,确认号ack=x+1,初始序号seq=y。同样该报文不可携带数据,也要消耗一个字节的序号。然后B服务器进入SYN-RCVD(同步已收到)状态。
    ③ A客户端收到B服务器的确认报文后,还要向B发送已经确认的报文,首部字段ACK=1,seq=x+1,ack=y+1,客户端与服务器都进入ESTABLISHED状态。
    上面的①②③的过程就是三次握手。

    四次握手断开连接

    3.jpg
    1. 客户端发送一个报文给服务端(没有数据),其中FIN设置为1,Sequence Number置为u,客户端进入FIN_WAIT_1状态。
    2. 服务端收到来自客户端的请求,发送一个ACK给客户端,Acknowledge置为u+1,同时发送Sequence Number为v,服务端年进入CLOSE_WAIT状态。
    3. 服务端发送一个FIN给客户端,ACK置为1,Sequence置为w,Acknowledge置为u+1,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态。
    4. 客户端收到FIN后,进入TIME_WAIT状态,接着发送一个ACK给服务端,Acknowledge置为w+1,Sequence Number置为u+1,最后客户端和服务端都进入CLOSED状态。

    wireshark抓包查看三次握手

    计算机网络实验课:


    5.png

    看图可知:
    ① 192.168.99.78:52230发送SYN字段给192.168.9.172:8089。
    ② 192.168.9.172:8089返回SYN+ACK字段给192.168.99.78:52230。
    ③ 192.168.99.78:52230确认,返回ACK给192.168.9.172:8089。
    看下步骤①的详细信息:


    6.png
    源端口:52230;目的端口:8089;TCP片段长度为0;序号为0(随机生成的);确认字段为0;同步标识。
    应用层Http传输的数据大小为465字节。

    参考:计算机网络 谢希仁

    相关文章

      网友评论

          本文标题:回忆TCP协议

          本文链接:https://www.haomeiwen.com/subject/ixtwwftx.html