The Inter-Blockchain Communication (IBC) is an interoperability protocol that allows heterogenous datasystems - not just blockchains - to communicate arbitrary data.
IBC uses no trusted third parties. Chains A and B speaking to one another over IBC have light clients that act as a sparse representation of the counterparty. When A sends B a message over IBC, B can cryptographically verify that the message did indeed come from A and that it is valid by using its light client (along with Merkle proofs), which acts as a lightweight representation of A's blockchain. Off-ledger processes termed relayers are responsible for ferrying these messages within data packets from one chain to another. From IBC's point of view, two blockchains communicating with each other strips down to the light clients maintaining and updating state changes of the counterparty chain. And therefore, the security properties of IBC boils down to the security properties of the constituent light clients.
IBC acts as a general-purpose message passing protocol. Any form of arbitrary data can be communicated between different blockchains - or even datasystems that aren’t blockchains, such as solomachines.
IBC comprises of two distinct layers: the transport layer and the application layer.
The transport layer is only concerned with the transport, authentication and ordering of data packets. It is entirely un-opinionated about how the packets should be structured and how they need to be interpreted by a receiving chain. From the point of view of the transport layer, packets contain random bytes. Light clients and relayers form two important elements of the transport layer.
It is the application layer that the end-user interacts with and is responsible for defining packet structure with respect to a specific application. It determines how the packets are to be interpreted and acted upon.
A few examples of IBC-level application include fungible and non-fungible token transfer, Interchain Accounts, Interchain Security, Interchain Queries, and Fee Middleware.
A simple analogy that can be helpful in understanding IBC is that of a mail delivery system. When sending a letter to someone, you send it through a postal service that collects the envelope containing the letter from you and deposits it into the recipient's mailbox. The recipient then opens said envelope and reads your letter. The transport layer of IBC can be thought of as the postal service. The postal service does not tell you what the contents of the letter should be, or how the recipient should interpret your message. Neither do they know what the contents of the envelope are. It only performs the action of collecting the envelope from point A and sending it to point B. The envelope itself can be thought of as IBC packets that are sent from one chain to another. And on this envelope, you would specify the address of the recipient.
This is similar to how IBC packets contain information regarding who sent the packet and to whom it is intended for. In the end, it is the receiver (application) that is responsible for opening the envelope (data packet) and interpreting the contents of the letter.
See here if you'd like a more simple overview of IBC.