TCP

  ISO七层模型:

  ISO/OSI模型 协议数据单位 TCP/IP协议 TCP/IP模型
主机层 应用层(Application)   DotnetFtpLibrary, SMTP web API, SSH, SmmpSharpNet, HTML Class, API server 应用层
表示层(Presentation) Data CSS, GIF, HTML, XML, TSON, SIMIME,
会话层(Session)   RPC, SCP, NFS, PAP, TLS, FTP, HTTP, HTTPS, SMTP, SSH, Telnet
传输层(Transport) Segment(TCP),Datagram(UDP) NBF, TCP, UDP 传输层
媒介层 网络层(Network) Packet IP, APPLE TALK ICMP, IPsec 网络层
数据链路层(Data Link) Frame ARP, RARP, IEEE:802.2, MPLS, LITP, LLPP, MAC, PPP, ATM 网络接口层
物理层(Physical) Bit Ethernet physical layer, DOCSIS, DSL, ISDN, RS-232 硬件层

    TCP(Transaction Control Protocol, 传输控制协议)

  TCP是一种面向连接的,可靠的基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认,对失序的数据重新排序,丢弃重复数据。

  TCP特点:面向连接的运输层协议;提供可靠的交付的服务;提供全双工通信,数据在两个方向上独立的进行传输。因此连接的每一段必须保持每个方向上的传输数据序号;面向字节流,应用程序和TCP交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅是一连串的无结构的字节流。  

    TCP头格式

Byte Offset 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 Source Port Destination Port
4 Sequence Number
8 Acknowledge Number
12 offset  reserved TCP flags(C E V A P R S F) Window
16 Checksum Urgent Pointer
20 TCP Options(varible length, optional)
  nibble byte word

Source Port(源端口号):数据发起者的端口号。16bit

Destination Port(目的端口号):数据接收者的端口号。16bit

Sequence Number(序列号码):用于在数据通信中解决网络包乱序问题,以保证应用层接收到的数据不会因为网络上的传输问题而乱序。32bit

Acknowledgement Number(确认号码,ack):数据接收方期望收到发送方在一个报文段的顺序号码(seq)。因此确认号码应用是上次已成功收到的顺序号码加1。32bit

Offset(TCP报文头长度):用于存储报文头中有多少个32位。存储长度位4bit。最大可表示为长度为60bytes的报文头,最小值是20bytes.

Reserved(保留):6bit,均为0

TCP Flags(TCP标志位):每个长度为1bit

  CWR:压缩 0x80

  ECE:拥塞 0x40

  URG:紧急 0x20 当URG=1表示报文段有紧急数据,应尽快传送

  ACK:确认 0x10 当ACK=1表示这是一个确认的TCP包,为0表示不是确认包。ack是发送方希望对方在下次返回报文中给回的seq。

  PSH:推送 0x08 当发送端PSH=1时,接收端尽快的交付给应用进程

  RST:复位 0x04 当RST=1时,表明TCP连接中出现严重差错,必须释放连接再重新连接

  SYN:同步 0x04 在建立连接时用来同步序号。SYN=1 SEQ=0表示一个连接请求的报文段;SYN=1 ACK=1表示同意建立连接

  FIN:终止 0x01 当FIN=1时表明此报文段的发送端的数据已发送完毕,并要求释放传输连接

Window(窗口):用来控制对方发送的数据量。通知发放已确定的发送窗口的上限

Checksum(检验和):该字段检验的范围包括头部和数据这两部分。由发送端计算和存储,并由接收端进行验证。

Urgent Pointer(紧急指针):紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数

TCP Options(TCP选项):长度可变,最长可达40字节

    建立连接

  建立连接需要三次握手:

    sentS SYN=1 Seq = 0    第一次客户端向服务端发送连接请求包,标志位SYN置为1,顺序号码Seq置为0

    sentC SYN=1 ACK=1 Seq=0  ack=1    第二次服务端收到客户端发过来的报文,由SYN=1知道客户端要求建立联机,则为这次连接分配资源,并向客户端发送一个SYN和ACK都置为1的TCP报文。设置初始化顺序号码为0,将确认序号ack设置为1

    sentS ACK=1 Seq=1 ack=2     第三次客户端收到服务端发来的包后检查确认号码ack是否正确。即第一次发送的seq加1以及标志位ack是否为1。若正确,客户端再次发送确认包ACK=1,SYN=0,Seq=1。Server收到后确认号码值与ACK=1则连接建立成功,可以传送数据

  断开连接需要四次握手:

    FIN=1 ACK=1 SEQ=1 ack=1    第一次客户端发给服务器端发送FIN报文,用来关闭客户端到服务端的数据传送。将标志位FIN和ACK置为1,顺序号码为1,确认号码为1

    ACK=1 ack=2 SEQ=1   第二次服务端收到FIN后,发回一个ACK=1,确认号码ack为2,顺序号码为确认号码即Seq=1,此时客户端进行FIN-WAIT状态,继续等待FIN报文

    FIN=1 ACK=1 ack=2    第三次当服务端确定数据已发送完成,则向客户端发送FIN报文。关闭与客户端的连接,标志位FIN和ACK置为1,顺序号码seq为Y+1,确认号码为2

    ACK=1 ack=2    客户端收到服务器发送的FIN后,发回ACK确认,确认号码为顺序号码加1,即ack=2。因网络不稳定等因素,发送ACK后进入TIME_WAIT状态。若Server端没有收到ACK则可以重传。Client端等待了2MLS后依然没有收到回复,则证明Server端已正常关闭

  

原文地址:https://www.cnblogs.com/forerver-elf/p/8242100.html