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端已正常关闭