TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。
应用层:为终端用户提供网络服务接口
表示层:提供数据格式转换服务
会话层:提供建立、管理、终止会话服务
传输层:定义传输数据的协议端口,以及流控和差错校验(端到端防火墙)
网络层:进行逻辑寻址(IP地址)实现不同网络之间的路径选择(路由器)
数据链路层:建立逻辑链接、进行硬件地址寻址、差错校验等一些功能(交换机网卡)
物理层:建立、维护、断开物理链接(网卡、网线、中继器、集线器、光纤)
协议 |
作用 |
端口号 |
对应的传输层协议 |
HTTP超文本传输协议 |
提供Web服务 |
80 |
TCP |
HTTPS |
加密 Web 服务 |
443 |
TCP |
FTP文件传输协议 |
共享文件 |
20/21 |
TCP |
TFTP简单的文件传输 |
69 |
UDP |
|
SSH |
远程登录(密文) |
22 |
TCP |
Telnet |
远程登录(明文) |
23 |
TCP |
DHCP动态主机控制协议 |
动态分配IP |
67/68 |
UDP |
DNS域名解析协议 |
解析域名 |
53 |
TCP/UDP |
RDP远程桌面协议 |
远程桌面显示 |
3389 |
TCP |
POP3电子邮件协议三 |
接收邮件 |
110 |
TCP |
SMTP简单邮件传输协议 |
发送邮件 |
25 |
TCP |
SMB协议 |
通信服务 |
445 |
UDP |
TCP协议:提供用户之间的面向连接可靠报文传输服务
UDP协议:提供用户之间的不可靠无连接的报文传输服务
IP(网络协议):提供网络结点之间的报文传送服务
ARP(地址解析协议):实现IP地址向物理地址的映射
RARP(逆地址解析协议):实现物理地址向IP地址的映射
ICMP(网络控制报文协议):探测并报告IP数据报传输中产生的各种错误
IGMP(网际组管理协议):管理多播组测成员关系
传输控制协议(TCP):定义了两台PC之间进行可靠的传输而交换的数据和确认信息的格式,以及计算机为了确保数据的正确到达而采取的措施。规定了TCP软件怎样识别给定计算机上的多个目的进程如何对分组重复这类差错进行恢复。还规定了两台计算机如何初始化一个TCP数据流传输以及如何结束这一传输。TCP最大的特点:提供面向连接、可靠的字节流服务。
SYN(同步)=1:表示这是一个连接请求或连接接受报文段。
ACK(确认)=1:确认号生效,ACK=0确认号失效。
seq(序号):本报文段所发送的数据的第一个字节的序号。
ack(确认号):期望收到对方下一个报文段的第一个数据字节的序号。
RST(复位):=1时表示释放当前连接,重新建立连接。还用来拒绝一个非法的报文段或拒绝打开一个连接。
握手之前:B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求,服务器进程就处于LISTEN(收听)状态。A的客户端进程也是首先创建传输控制块TCB。
第一次握手:A向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段(即SYN=1的报文段)不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入SYN-SENT(同步已发送)状态。
第二次握手:B收到连接请求报文段后,如果同意建立连接,则向A发送确认。在报文段中应把SYN位和ACK位都置为1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。
第三次握手:TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。TCP标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。这时,TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。当B收到A的确认后,也进入ESTABLISHED(已建立连接)状态。
半连接:收到SYN包而还未收到ACK包时的连接状态称为半连接,即尚未完全完成三次握手的TCP连接。
半连接队列:在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的SYN包(SYN=i )开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_ RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
Backlog参数:表示半连接队列的最大容纳数目。
SYN-ACK重传次数:服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息、从半连接队列中删除。注意,每次重传等待的时间不一定相同。
半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时也称半连接存活时间为Timeout时间、SYN_RECV存活时间。
FIN(终止):释放连接
第一次挥手:A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭
TCP连接。A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1。 这时A进入FIN-WAIT-1 (终止等待1)状态,等待B的确认。请注意,TCP规定,FIN报文段即使不携带数据,它也消耗掉一个序号。
第二次挥手:B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT(关闭等待)状态。
第三次挥手:若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN= 1。现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次已发送过的确认号ack=u+ 1。这时B就进入LASTACK (最后确认)状态,等待A的确认。
第四次挥手:A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack=w+ 1,而自己的序号是seq=u+ 1 (根据TCP标准,前面发送过的FIN报文段要消耗一个序号)。然后进入到TIME-WAIT (时间等待)状态。
挥手后:请注意,现在TCP连接环没有释放掉。必须经过时间等待计时器(TIME WAIT timer)设置的时间2MSI后,A才进入到CLOSED状态。时间MSL叫做最长报文段寿命(Maximum Segment Lifetime), RFC 793建议设为2分钟。但这完全是从工程上来考虑的,对于现在的网络,MSL = 2分钟可能太长了一些。因此TCP允许不同的实现可根据具体情况使用更小的MSL值。因此,从A进入到TIME-WAIT状态后,要经过4分钟才能进入到CLOSED状态,才能开始建立下一个新的连接。当A撤销相应的传输控制块TCB后,就结束了这次的TCP连接。
用户数据报协议(UDP):是一个简单的面向数据报的传输层协议。提供的是非面向连接的、不可靠的数据流传输。UDP不提供可靠性,也不提供报文到达确认、排序以及流量控制等功能。它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。因此报文可能会丢失、重复以及乱序等。但由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
TCP |
UDP |
|
是否连接 |
面向连接 |
无连接 |
传输可靠性 |
可靠的 |
不可靠的 |
应用场景 |
传输少量数据 |
大量数据 |
速度 |
慢 |
快 |