Это зависит от ОС, но обычно это зависит от того, как вы их читаете. Взгляните на пару документов linux на POSIX-сокетах:
В частности, вы используете SOCK_RAW, тогда recvfrom не всегда будет возвращать полные пакеты. См. Следующие цитаты:
Если сообщение слишком длинное, чтобы поместиться в предоставленный буфер, лишние байты могут быть отброшены в зависимости от типа сокета, из которого получено сообщение.
Если len слишком мал, чтобы вместить весь пакет, лишние байты будут возвращены при следующем чтении.
При получении вызовов обычно возвращаются любые доступные данные, вплоть до запрошенной суммы, ачем ожидание получения всей запрашиваемой суммы.
К вашему вопросу:
Предоставляют ли необработанные сокеты собранный пакет, или мне нужно самостоятельно выполнить дефрагментацию?
Они этого не делают, вам нужно отделить себя. Если сокет не очищен или происходит фрагментация, вызов вернет все доступные данные, возможно, только частичные пакеты, ожидая, что вы их реструктурируете.