A packet is the unit written or read at one time. A message can consist of one or more packets. A packet always includes a packet header and is usually followed by packet data that contains the message. Each new message starts in a new packet.
In practice, both the client and server will try to read a packet full of data. They will pick out the header to see how much more (or less) data there is in the communication.
At login time, clients MAY specify a requested "packet" size as part of the LOGIN7 message stream. This identifies the size used to break large messages into different "packets". Server acknowledgment of changes in the negotiated packet size is transmitted back to the client via ENVCHANGE token stream. The negotiated packet size is the maximum value that can be specified in the Length packet header field described in section 126.96.36.199.3.
Starting with TDS 7.3, the following behavior MUST also be enforced. For requests sent to the server larger than the current negotiated "packet" size, the client MUST send all but the last packet with a total number of bytes equal to the negotiated size. Only the last packet in the request can contain an actual number of bytes smaller than the negotiated packet size. If any of the preceding packets are sent with a length less than the negotiated packet size, the server SHOULD disconnect the client when the next network payload arrives.