HttpApplication is the web application instance that has multiple
IHttpModule instances registered in it. That‘s why every
IHttpModule instance handles a certain part of application execution thus can usually be reused on many applications (think of a
Session handling module or authentication module).
In terms of application/request handling there are many similarities.
HttpApplication has access to application-level events like OnStart, OnEnd etc as well as request-level events like OnBeginRequest, OnEndRequest etc.
IHttpModule on the other hand only has access to request-level events.
Additional note: It‘s possible to handle application start and end events even using an IHttpModule, but this is a non-documented feature and you have to take some special precautions. Check these two blog posts that explain it all into great depth:
Writing a custom
How to correctly use
I suggest you read a bit about application life cycle execution pipeline: