Many of the responses to this problem wind up being STP and the need to use PortFast. It is the case so often that there is little information to help with what to do once you rule out STP.
I ran into this problem and would never have resolved it without using tcpdump with the "-vv" option from any old machine on the same network segment as the client with the problem. Promiscuous mode is not needed.
When a standard PXE client boots it will ask the DHCP server for the usual items: IP; subnet; gateway; etc. However, it also asks for the tftp server name and the boofile name. This is all part of ONE request. I had always been mistaken in thinking that the ask for PXE server vitals was a second request once the machine had its IP info and could talk on the network. If these PXE items are missing, as they were in my case due to a config file error, the client appears that it cannot acquire an IP address, which shows up as repeated DHCP-Discover and DHCP-Offer, with no DHCP-Request. In my case the client did get the response with IP info, only the response was incomplete, based on what was asked... so the client asked again, and again, until it timed out. I wasted a lot of time thinking the client wasn't receiving the "offer" when it was. The client just wasn't happy with the offer. I was tweaking vlan's and ip-helpers, and stp config's. I was looking in the wrong place.
The difference between good and bad response was the malformed "offer" had no bootfile name, so the client kept asking. Once the config file was fixed the "offer" did contain the tftp server name and bootfile name. The client was satisfied with the content if the "offer" so it then issued a Request, then used the PXE info to contact the TFTP server.