From b51ae985d7d808d649fa15073cf1d34082bb5c23 Mon Sep 17 00:00:00 2001 From: Ziheng Chen <zc328@dragons.drexel.edu> Date: Mon, 3 Mar 2025 04:03:08 +0000 Subject: [PATCH] Upload New File --- w8/questions.md | 77 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 w8/questions.md diff --git a/w8/questions.md b/w8/questions.md new file mode 100644 index 0000000..3e413dd --- /dev/null +++ b/w8/questions.md @@ -0,0 +1,77 @@ +1. How does the remote client determine when a command's output is fully received from the server, and what techniques can be used to handle partial reads or ensure complete message transmission? + +_answer here_ + +> Loop Until EOF Character is Received + +> - The client continuously reads from the socket using `recv()`, checking if the last byte received is `0x04` (EOF). +> - If the EOF character is detected, the client knows the full response has been received. + +> Buffering and Aggregation +> Since `recv()` may return partial data, the client should append data to a buffer until the EOF character is found. + + + + +2. This week's lecture on TCP explains that it is a reliable stream protocol rather than a message-oriented one. Since TCP does not preserve message boundaries, how should a networked shell protocol define and detect the beginning and end of a command sent over a TCP connection? What challenges arise if this is not handled correctly? + +_answer here_ + +> Use a Terminator Character +> - The protocol can use a special delimiter, such as `\0`(null byte) for commands and `0x04` (EOF) for responses. +> Include Message Length in the Header +> - A fixed-size header can precede each message, specifying the number of bytes in the payload. +> Use a Structured Format (e.g., JSON, XML) +> - While not ideal for simple shell protocols, structured formats like JSON allow parsing with defined message start and end markers. +> Chanllenges: +> - TCP might split a message across multiple `recv()` calls, requiring the client to reconstruct it. +> - TCP might merge multiple commands into one `recv()` call, requiring the client to parse multiple messages properly. +> - If no end delimiter is used, the client may read incomplete commands, leading to unexpected behavior. + + +3. Describe the general differences between stateful and stateless protocols. + +_answer here_ + +> A stateful protocol maintains session state between client and server across multiple interactions, whereas a stateless protocol treats each request as independent with no retained memory of past interactions. + +> Stateful Protocols: +> The server remembers previous interactions. Requires more server-side resources (e.g., memory, session tracking). +> Examples: +> - TCP (tracks sequence numbers, retransmissions). +> - SSH (maintains authentication state). +> - HTTP with Sessions (stores login cookies). + +> Stateless Protocols: +> Each request is independent; no session state is stored. Easier to scale since no session tracking is needed. +> Examples: +> - UDP (each packet is independent). +> - HTTP (by default, unless cookies or tokens are used). +> - DNS (each lookup request is processed independently). + +4. Our lecture this week stated that UDP is "unreliable". If that is the case, why would we ever use it? + +_answer here_ + +> Although UDP is unreliable, which does not guarantee packet delivery, order, or integrity, it is still useful for applications where speed and low latency are more important than reliability. +> Since there is no connection setup or retransmission, UDP is much faster than TCP, which lower the latency. +> UDP allows sending packets to multiple recipients simultaneously, which is crucial for Streaming video/audio, Online gaming (real-time updates), IoT devices (sensor updates) +> DNS uses UDP because queries are small and fast (retrying is faster than using TCP). + +5. What interface/abstraction is provided by the operating system to enable applications to use network communications? + +_answer here_ + +> The operating system provides socket APIs that allow applications to communicate over a network using protocols like TCP and UDP. + +> Example: +> Berkeley Sockets API (socket.h) + +> Standard API used in C, C++, Python, etc. for network communication. +> Functions: +> socket() → Creates a socket. +> bind() → Binds a socket to an IP/port. +> listen() → Marks a socket for incoming connections. +> accept() → Accepts a new client connection. +> connect() → Connects to a remote server. +> send()/recv() → Sends & receives data. -- GitLab