# 2023-10-05

> **Summary**

> **keywords**

> **TODO**

> **HW**

> **Exercise**\*

> **Next time**\
> TCP. and more about multiplexing with TCP.

***

## Recap

### video buffer

> currently on Streaming stored video. Chapter 7.2 on 6th ed.

In Video streaming, there's a TCP buffer, and Client buffer.\
\#read: analysis on video streaming

\#todo : paste image of buffer (with x, Q, R..)\
Startup delay : Q/x sec.\
where Q is the minimum byte client needs to start showing.\
x is the transmission rate (byte/ sec)

when R is bigger than x, and depletion rate is faster than x, there will be stopping in playing.\
when R is smaller than x, the buffer will be full, and there will be packet drop.

***

## Video Streaming (Cont'd)

### Manifest files

manifest file provides URLs for different chunks.\
manifest file is sent first. As the client manages the buffer, it chooses the right chunk needed.

***

## Socket programming w/ UDP & TCP

Steps (Application layer -> Transport layer)\
the running application is called a **process**.\
The process will create a socket with designated port.\
Done. All others are out of hand.

TCP will take care of the un-landed packets. (by ACK)\
UDP do not do connection establishment. UDP do not do a handshake.\
In UDP, sender explicitly attaches destination IP & port to each packet.

### Socket w/ UDP

#### Example app: UDP client

```python
from socket import *
serverName = 'hostname'
serverPort = 12000
clientSocket=socket(AF_INET,SOCK_DGRAM)

message=raw_input("input lower case sentance")
clientSocket.sendto(message.encode(),(serverName,serverPort)) #encodes string into bytes.

modifiedMessage, serverAddress = clientSocket.recvfrom(2048) # max byte to be recieved.
print modifiedMessage.decode() # utf-8 to string
clientSocket.clse()
```

#### Example server : UDP server

```python
from socket import *
serverPort = 12000

serverSocket=socket(AF_INET,SOCK_DGRAM)
serverSocket.bind(("",serverPort))
print("The server is ready to receive")

while True :
	message,clientAddress = serverSocket.recvfrom(2048)
	modifiedMessage - message.decode().upper()
	serverSocket.sendto(modifiedMessage.encode(),clientAddress)
```

### Socket w/TCP

* when client creates socket: client establishes connection to server TCP
  * difference : the `accept()` function is needed.
  * \#todo : check the process w/ wireshark.
* new socket for each client.

#### Example app : TCP client

```python
from socket import *
serverName = 'servername'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connet((serverName,serverPort))

```

\#todo : fill out the codes. both server and app.

#### Example server :TCP client

```python
...
while Ture:
	connectionSocket, addr = serverSocket.accept()

	sentence = connectionSocet.recv(1024).decode()
	capitalizedSentence = sentence.upper()
	connectionSocket.send(capitalizedSentence.encode())

	connectionSocket.close()
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://2ood.gitbook.io/2ood-knowledge-base/lecture-notes/networks/2023-10-05.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
