参考文档
Transmission Control Protocol ~ Wiki
一、 Transmission Control Protocol 传输控制协议
1、网络分层
网络协议
在网络OSI的七层模型中
TCP在第四层——Transport层,
IP在第三层——Network层,
ARP在第二层——Data Link层;
在第二层上的数据,叫Frame,
在第三层上的数据,叫Packet,
第四层的数据,叫Segment。
同时,我们需要简单的知道,数据从应用层发下来,会在每一层都会加上头部信息,进行封装,然后再发送到数据接收端。这个基本的流程你需要知道,就是每个数据都会经过数据的封装和解封装的过程。
TCP/IP协议簇2、TCP Header
TCP Header
Sequence number (32 bits)
Has a dual role:
- If the SYN flag is set (1), then this is the initial sequence number. The sequence number of the actual first data byte and the acknowledged number in the corresponding ACK are then this sequence number plus 1.
- If the SYN flag is clear (0), then this is the accumulated sequence number of the first data byte of this segment for the current session.
序号(32位)
有双重作用:
- 如果SYN标志置位(1),则这是初始序列号。然后,实际第一个数据字节的序列号和相应ACK中的确认号码是该序列号加1。
- 如果SYN标志为清除(0),则这是当前会话的该段的第一个数据字节的累积序列号。
Acknowledgment number (32 bits)
If the ACK flag is set then the value of this field is the next sequence number that the sender of the ACK is expecting. This acknowledges receipt of all prior bytes (if any). The first ACK sent by each end acknowledges the other end's initial sequence number itself, but no data.
确认号码(32位)
如果设置了ACK标志,则该字段的值是ACK的发送方期望的下一个序列号。这确认收到所有先前的字节(如果有的话)。每端发送的第一个ACK确认另一端的初始序列号本身,但没有数据。
Flags (9 bits) (aka Control bits)
Contains 9 1-bit flags
-
ACK (1 bit): indicates that the Acknowledgment field is significant. All packets after the initial SYN packet sent by the client should have this flag set.
-
SYN (1 bit): Synchronize sequence numbers. Only the first packet sent from each end should have this flag set. Some other flags and fields change meaning based on this flag, and some are only valid when it is set, and others when it is clear.
标志(9位)(又名控制位)
包含9个1位标志
-
ACK(1比特):表示
Acknowledgment field
是有效的。客户端发送的初始SYN数据包之后的所有数据包都应设置此标志。 -
SYN(1位):同步序列号。只有从每一端发送的第一个数据包应该设置此标志。其他一些标志和字段会根据此标志更改含义,有些仅在设置时有效,有些仅在清除时有效。
3、TCP协议头部的格式
image.png
下面就将每个字段的信息都详细的说明一下:
-
Source Port和Destination Port:分别占用16位,表示源端口号和目的端口号;用于区别主机中的不同进程,而IP地址是用来区分不同的主机的,源端口号和目的端口号配合上IP首部中的源IP地址和目的IP地址就能唯一的确定一个TCP连接;
-
Sequence Number:用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节在数据流中的序号;主要用来解决网络报乱序的问题;
-
Acknowledgment Number:32位确认序列号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到数据字节序号加1。不过,只有当标志位中的ACK标志(下面介绍)为1时该确认序列号的字段才有效。主要用来解决不丢包的问题;
-
Offset:给出首部中32 bit字的数目,需要这个值是因为任选字段的长度是可变的。这个字段占4bit(最多能表示15个32bit的的字,即4*15=60个字节的首部长度),因此TCP最多有60字节的首部。然而,没有任选字段,正常的长度是20字节;
Window:窗口大小,也就是有名的滑动窗口,用来进行流量控制;
4、TCP 3 way handshake
TCP 3 way handshake第一次握手
:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
第二次握手
:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
第三次握手
:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
5、TCP four-way handshake
four-way handshake
第一次分手
:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次分手
:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我“同意”你的关闭请求;
第三次分手
:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
第四次分手
:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。
6、TCP变化状态图
1920px-Tcp_state_diagram_fixed_new.svg.pngTCP 总结
1、没有什么通信连接是安全的,三次
是收敛,概率的选择。 即使一万次握手也就是99.99999% ,没法做到100%。因为最有一次握手是不会被确认的。
2、SYN:就是为三次握手设计的。
3、FIN:就是为四次分手设计的
补几张网络上的图加强理解:
computer-network-osi-model-layers.png osi-model-7-layers-1024x734.jpg Osi-model-jb.png 屏幕快照 2019-01-15 下午2.32.19.png
网友评论