3.1 Transport layer service
-> TCP, UDP가 여기에 속함
Network layer vs Transport layer
- network : 호스트간의 통신을 담당
- transport : 프로세스 간의 통신을 담당
3.2 Multiplexing/deMultiplexing
-> 프로세스로부터 세그먼트를 받아 헤드를 붙이는 것 : 멀티 플렉싱
-> 받아서 헤더를 활용해 정확한 프로세스에게 전달 : 디 멀티 플렉싱
demultiplexing
- 네트워크 레이어의 IP주소를 받아서 호스트를 연결
- 포트 넘버를 사용해서 정확한 소켓(프로세스)에 전달
- UDP와 TCP의 헤더 내용은 다르지만 source port, dest port는 공통적으로 존재함
connectionless demultiplexing
- udp에서 사용하는 디멀티프렉싱임
- 연결이 없음 : 도착 포트넘버만 같으면 항상 그 소켓으로 전달
connection-oriented demultiplexing
- tcp에서 사용 : 소켓이 IP주소(도착, 출발), 포트 번호(도착, 출발) 4가지를 다 비교함
3.3 connectionless transport : UDP
-> 과거 멀티미디어 앱, DNS SNMP에 사용
-> 연결이 필요없고 헤더 크기가 작음
- source port, dest port : 공통
- length : 헤더의 8바이트 + app의 전체 크기를 담고 있음
UDP CHECKSUM
- 세크먼트 헤더에 포함, 데이터 전송간에 오류가 있는지 판별
- Sender : 세그멘트 헤더에서 checksum 필드를 제외 app 포함 16비트 4개를 더해서 한개의 16비트를 만든 후 0과1을 뒤집어 줌(이게 checksum) -> checksum field에 담아서 보냄
- Receiver : 받은 세그멘트에서 같은 방법으로 checksum계산, sender 헤더의 checksum필드와 비교 -> 다르면 반드시 에러, 같으면 에러가 있을수도 있지만 없다고 판단(매우 적은 케이스)
3.4 principles of reliable data transfer
rdt 1.0 : reliable transfer
- FSM : finate state machines

1.0 : 에러, 로스 없음
- sender : app layer에서 데이터 받기, 패킷 만들고 전송, 다시 상태 유지
- receiver : 네트워크에서 페킷 받기, 데이터 꺼내서 app layer로 보내고 상태 유지
rdt 2.0 : bit error(로스는 없음)
- checksum을 활용해서 에러 체크
- 에러가 있으면 ack 없으면 nak를 보냄

Sender : 페킷 보내고 ack or nak를 기다림,
nak가 오면 재전송 재전송에 대한 결과 대기, ack면 다시 app layer에서 데이터 보내주길 대기

receiver : 페킷을 받으면 checksum확인 다르면 nak보내고 다시 대기 맞으면 ack보내고 app layer로 데이터 전송
2.0의 fatal flaw
- ACK, NAK 자체의 corrupted
- Sender 입장에서는 그냥 다시 보내버림(반복의 문제)
- sequence number을 같이 보내 중복인지 확인할 수 있게 함
stop and wait : 하나 보내고 잘 보냈는지 확인 한 후 다시 보내는 방식
rdt 2.1 : 시퀀스 넘버, checksum의 corrupt 추가

Sender
-
- 시퀀스 넘버는 0,1,0,1을 반복
-
0번 데이터 위에서 받아서 데이터, 체크섬, 시퀀스 전송후 대기
-
대기 상태에서 nak가 오거나 corrupt되면 재전송 후 대기
-
corrupt가 아니면서 ack이면 시퀀스 1번이 app에서 오기를 대기함
-
그 후 부터는 동일 하면서 시퀀스 번호만 0,1반복

Receiver
1이나 0을 대기할때 다른 시퀀스가 오는 이유 : 다른 시퀀스로 넘어가면서 ack를 보내는데 이게 sender에서 corrupt될 경우 재전송 하기 떄문
rdt2.2 : ack만을 사용

1번을 기다릴때 정상적이면 1번 ack를 만들어둠
0번을 기다릴때 corrupt혹은 nak일때 이전에 만든 것을 보냄
0,1 바뀌어도 동일
rdt 3.0 : 에러와 손실
- 일정 시간동안 ack가 안오면 재전송 : 손실이라고 판단
- 만약 손실이 아니라 딜레이였다면? : 중복이 발생하지만 시퀀스 넘버로 해결가능

- 0번 데이터를 페킷 만들어서 보낼 때 타이머 시작
- 만약 corrupt나 1번에 대한 ack가 오면 그냥 아무 행동을 하지 않음 -> 타임아웃으로 재전송
- 재전송시 타이머 재시작, ack 0번 대기
- ack가 제대로 오면서 corrupt가 아니면 타이머 멈추고 1번에 대한 데이터 대기
- 만약 이전에 보냈던 0번 ack가 오면 현재 1번 데이터 대기 중이니 무시하면 됨
receiver : 2.2와 동일하다
rdt 3.0 operation

,,, stop and go : 성능이 안좋다
Pipeline protocol : ack를 받지 않고 그 다음을 보냄
- 시퀀스 넘버가 증가 해야한다
- 버퍼링 : 여러개의 정보를 저장할 필요가 있음
- Go-Back-N / Selective repeat

stop and wait의 3배의 능률
Go-Back-N
- 시퀀스 넘버 : n개 필요 n=10이면 4비트 필요

- ack를 받음, 보내고 ack를 못받음, 아직 안보냄, 보낼 수 없음(n초과)
- sender는 보내고 ack를 못받은 가장 오래된 패킷의 타이머를 실행 : 타임아웃되면 그 이후의 모든 노란색 패킷을 보냄
Sender

- 정상적으로 app에서 데이터를 받음
- base + n : 보낼 수 있는 최대 범위 -> 다음 페킷은 아 숫자보다 작아야함
- 만족하면 버퍼 저장하고 보내면 됨
- 만족 하지 않으면 그냥 삭제함
- 만약 다음 보낼 페킷이 베이스와 같으면 -> 처음 보내는 상황 : 타이머 실행
- 보내면 무조건 다음 보낼 페킷 +1
- ack를 받고 corrupt가 없으면
- 베이스를 받은 엑크의 번호+1로 바꿈(노란색)
- 이때 베이스가 다음 페킷 번호와 같으면(모든 ack를 받음) 타이머 멈춤, 다르면 차이머 재시작
- ack가 corrupt되면 그냥 아무것도 않하면 된다
- timeout되면 : 타이머 재시작, 베이스~ 다음 페킷-1(노란색) 재전송
receiver

원하는 패킷이 오면 ack그 번호로 보내고 그거 저장
원하는 번호가 아닌 다른 모든 번호에 대해서는 미리 만들어둔 ack를 계속 전송
Selective repeat
sender 
go-back-n과 다르게 ack를 뒤에거를 먼저 받을 수 있음
receiver

리시버 센더의 윈도우가 따로 있다

sender
- ack받으면 해당하는 페킷 초록색
- 베이스의 ack를 받으면 안받은 가장 작은 페킷으로 베이스(윈도우) 이동
- 타임아웃 = 그 페킷 재전송, 타이머 재실행
receiver
- ack 전송
- out of : 뒤에 파란색이 오면 그냥 저장
- in order : 베이스가 오면 받은거 쭉 이어져 있는거 app layer에 전송 베이스 안받은 페킷으로 이동
- 앞에 있는게 다시 오면 ack해줘야 함 안보내면
(sender)가 무한 전송 할수도 있음
시퀀스 넘버는 양쪽의 공간(n)을 합친거 보다 크거나 같아야 함
3.5 connection-oriented transport : TCP
시퀀스 넘버를 바이트 단위로 나눔
-
acknowledgements : 다음에 받길 원하는 번호

-
ack를 보낼떄는 받은 시퀀스에 1더해서 보냄
-
결국 ack는 받고싶은 번호, 시퀀스는 실제로 보내는 번호
RTT : 일정하지 않음

이 식으로 평균 RTT를 구함
보통 알파 = 0.125
-> 측정한 RTT가 오래 될수록 영향력이 감소 하는 것
그래서 안전한 마진을 구해서 TIME OUT시간을 정함

reliable data transfer
TCP Sender

-
- app에서 데이터를 받음 -> 세그먼트 생성(시퀀스 넘버 : 처음 정한 번호) -> 네트워크 레이어로 전송, 넥스트 시퀀스 넘버를 기존 넘버에 여기서 보낸 데이터의 바이트만큼 더해야함(한 개의 페킷을 보내는게 아닌 바이트단위로 보내기 떄문)
+추가로 타이머 없으면 타이머 실행
-
- 타임아웃 : 아직 ack를 안받은 세그먼트 중 시퀀스 넘버가 가장 적은 세그먼트 전송, 타이머 실행
-
- ack를 받은 경우
- ack의 벨류 : Y -> Y-1까지는 다 받았다는 뜻
- Y가 베이스보다 크면 Y를 베이스로 바꿈
- 타이머
TCP Receiver
-
delayed ack : 정상적으로 받고 딜레이 후에 ack를 보내 보내는 총 갯수를 줄임
-
딜레이 전에 또 데이터가 오면 딜레이, 새로 온 데이터 합쳐서 ack를 한번에 보냄
-
100번을 기다리는데 120번이 오면? -> 그냥 내가 받고싶은 ack를 또 보내면 된다
-
??
TCP fast retransmit
-
sender가 같은 데이터의 ack를 3개 받은 경우 : triple duplicate acks -> 타임아웃을 기다리기전에 데이터가 손실 되었다고 판단, 재전송
TCP flow control
- sender가 너무 많이 보내서 receiver가 못받는 상황을 방지
- 리시버가 ack를 보낼떄마다 남아있는 버퍼의 사이즈를 보냄(세그먼트 헤더에 receive window)
- 버퍼가 꽉차면 ack를 안보내는 식으로
Connection management
-
2way 핸드쉐이크 : 메시지 왔다 갔다 끝(인간식임) -> 기계는 손실, 딜레이 때문에 사용 못함(서로 확인 불가능하기 떄문)
-
TCP 3-way handshake connection

- 클라이언트쪽 처음에 LISTEN -> CLOSED
-
closing

- 끝내고 싶은 쪽에서 fin
- 반대쪽에서 ack
- 다시 요청받은쪽에서 fin
- 반대쪽에서 ack
congestion control