
Network layer: host 간의 logical communiction 제공





source IP addr, source port num, dest IP addr, dest port num>source IP addr와 source port num로 구분한다
- 같은 목적지 포트 번호(80)을 이용하는 두 client
- host C가 서버 B로 2개의 HTTP 세션 시작
- host A가 서버 B로 1개의 HTTP 세션 시작
- 각 호스트와 서버는 각자 유일한 IP 주소를 가진 모습







- reliable data 전송은 application, transport, link layer에서 중요한 역할
- TCP는 transport layer에서 논리적인 신뢰성 있는 연결을 위해 사용되며 ARQ 체계를 활용한다



(L: bits, R: bits/sec)
(Utilization의 의미는 효과적인 처리량을 나타냄)-> sol: pipelined protocol



(2번 패킷을 못받아서 다른 패킷들이 와도 무시하고 다음 패킷이 2번이라는 ACK만 계속 보내니까 나머지 패킷들은 gab이 생겨 버려짐, timeout돼서야 2번 패킷이 와서 정상 동작)






TCP/IP header + segmented data at MSSMSS + TCP/IP header length









LostACK

Premature Timeout

Cumulative ACK

- ACK가 손실되면 retransmission을 줄이는 편으로 대처한다
- ex) 90 100 " " 120 인 경우 ACK=100 (가장 최근 unacked 직전까지의 ACK 보냄)
(아래 ACK generation의 3번)






- 송신자가 수신자의 버퍼를 오버플로시키는 것을 방지하기 위해 하는 건 flow control
- 송신자가 IP네트워크의 혼잡 때문에 억제되는 것은 congestion control
잘 구분하기


rwnd = RcvBuffer - (LastByteRcvd - LastByteRead)
LastByteRcvd - LastByteRead <= RcvBuffer (빈 버퍼 공간이 더 많아야한다)
window 사이즈 <= rwnd (보내질 수 있는 범위는 수신 버퍼 여유 공간 양보다 무조건 작아야 함)
LastByteAcked: ACKed segment의 마지막 바이트 번호
LastByteSent: window안에 있어 보내질 수 있지만 아직 보내지지 않아 확인되지 않은 segment의 마지막 바이트 번호
LastByteSent - LastByteAcked <= rwnd
수신자가 ACK 전달할 때, rwnd 사이즈를 포함해서 전송
송신자의 window는 rwnd보다 작아야한다..




x를 랜덤으로 선택하고, 최초의 TCP SYN세그먼트의 순서 번호 필드에 이 번호를 넣음 (seq = x)y을 선택하고 TCP SYN세그먼트의 순서 번호 필드에 이 번호를 넣음 (seq = y)x+1)y+1)x를 따라서, 서버에서 보내기 시작한 것은 y를 따라서... (ISN을 설정한다는 것은 초기값만 설정하는거고, 주고받을 때마다 +1씩)
clientSocket.close()x)x+1)y)y+1)


queueing)
- generating rate (패킷이 생성되는, 차는 속도)
- service rate (패킷이 전송되는 속도)
- generating rate < service rate : throughput 손실 (packet이 더 많아야함)
- generating rate > service rate : delay 발생 (buffer 대기)
- generating rate = service rate : 가장 이상적 (버퍼에 데이터가 없고 계속 생성되자마자 전송)



No CongestionModerate CongestionSevere Congestion


흐름제어

혼잡제어

MSS * (MSS / cwnd)씩 cwnd를 증가시킴 (즉, RTT(round-trip time)마다 MSS씩 증가됨)increment = MSS * (MSS / cwnd)
cwnd += incrementcwnd /= 2 


MSS씩 증가시키는 AIMD와 다르게, ACK를 받을 때마다 MSS씩 증가시킴increment = MSS;
cwnd += increment



MSS/cwnd만큼 증가시킴 (즉, RTT마다 MSS만큼 증가)
cwnd/2 + 3로 변경하고 ss로 돌아감 (타임아웃으로 손실 해당 안됨 -> 그대로 tahoe 적용)

| 제목 | new ACK | timeout loss | 3 dup.ACKs |
|---|---|---|---|
| Tahoe | ssthresh 기준으로 SS(+1)와 CA(+1/cwnd) | ssthresh = cwnd/2, cwnd =1 | ssthresh = cwnd/2, cwnd =1 (slow start trigger) |
| Reno | ssthresh 기준으로 SS(+1)와 CA(+1/cwnd) | ssthresh = cwnd/2, cwnd =1 | ssthresh = cwnd/2, cwnd/2+3 (fast recovery trigger) |
R일 때, 길이 k개이므로 용량을 k개로 나눠가지는 것
