오래 못 할 짓 하지 않기
[ 네트워크 ] 14. Transport layer : TCP ( flow control / connection control management ) 본문
[ 네트워크 ] 14. Transport layer : TCP ( flow control / connection control management )
쫑알bot 2024. 10. 19. 23:58Flow control
Q : 만약 Application Layer가 받는 속도보다
Network Layer가 보내는 속도가 더 빠르다면?
이에 대해서 문제가 생기지 않도록
Packet Header에 주고받는 Bytes 수를 정해두었다.
이 덕분에 Receiver는 Sender에 대한 조정을 하여
Sender가 Receiver의 Buffer에 넘쳐 흐르도록 담지 않도록 ( 양 , 속도 측면으로) 조정한다.
➡️ 이를 위해 Receiver는 Buffer에 얼만큼의 공간이 남았는지 알려준다.
( TCP header에 rwnd(Receive WiNDow) 로 담는다. )
RcvBuffer = rwnd(여유 공간) + Buffered data
Connection Management
: 데이터를 주고받기 전에는, Sender / Receiver가 Handshake 과정을 거쳐야한다.
ex) 당근마켓 거래로 비유하면, "혹시 당근...." "네..XX거래 ? " 느낌의 주고받는 내용이라고 생각하면 된다.
➡️ Connection 구축
➡️ Connection Param 교환 / ex) 시작 seq #
📌 2-way handshake
이게 항상 유효할까?
➡️ Delay가 항상 변칙적이다.
➡️ Loss 나면 다시 보내야한다.
➡️ 반대편이 어떤 상태인지 알 수 없다.
시나리오 1)
이런 상태면 괜찮다.
- 연결 신청을 주고받고 Req_conn + Acc_conn
- 정보도 정상적으로 주고 확인하고, DATA + ACK
하지만 이런 상황을 생각해보자.
- Connection 연결을 신청하고, 그에 대한 ACK가 너무 늦게 날라갔을 때 = Timeout
- 그 사이에 연결이 종료되거나 새로운 정보가 전송된다면, Server에서는 이를 판단할 수 없다.
➡️ 연결된 Client는 없는데, 정보가 들어온다?
만약 데이터를 받고 ACK 도 제대로 보내지 않았다면, 다시 보내야 할 것이다.
그럴 때 Sender가 다시 보낸다 해도, Receiver는 이미 있는 정보이기 때문에
Duplicated Data가 들어오게 된다.
📌 3-way handshake
2way handshake 문제를 해결하고자 나온 방식이다.
주고 받는 정보에 State도 추가하는 것이다.
1. Sender가 Receiver에게 연결하자고 요청함 : Flag = SYN
2. Receiver가 요청에 대해 확인했다는 의미로 응답을 보냄 : Flag = SYN + ACK
3. Sender가 Receiver가 응답한 걸 확인함 : Flag : ACK
- Sender : 너가 보낸 79번까지 받았어 + 해당 파일에 있는 42번째 자리에서 C크기로 하나 줄게
- Receiver : 너가 보낸 43번까지 받았어( 42번째 + C크기=(1) ) + 79번째 자리에서 하나 더 추가된 거 보내줄게
- Sender : 너가 더 보냈던 80까지 받았어 , 43번에 있는 거 (있으면) 줄게..
- 연결을 종료할 때
📌 4-way handshake
- Client가 연결을 종료하려고 FIN bit를 보낸다.
- Server가 종료 요청을 받았다는 의미에서 ACK를 보낸다.
➡️ 하지만 Server가 보내야하는 data들이 조금은 남아있기에 기다린다.
... 다 보냄
- 이번에는 Server가 Receiver에게 너가 요청한 거 이제 이행하겠다는 느낌으로
FIN bit 를 보낸다.
- Receiver가 알겠다고 ACK를 보낸다.
[ 요약 ]
- Receiver 가 FIN 보내고 마지막에 ACK (1,4번째)
- Sender 가 ACK 보내고 ,할 거 한 뒤에 FIN (2,3번째)
clnt : 끄자, 너가 꺼
-> serv : 하던 거만 다 끝내고!
-> clnt : (기다려줌)
-> serv : 다 했음 끝내도 됨
-> clnt : ㅇㅋ 너가 꺼봐 (기다림)
요런 느낌
이것도 설명할 줄 알아야 함
Congestion Control
Sender가 너무 과하게 많이 or 빨리 보내면
1) Long Delay가 발생하거나
2) Packet Loss가 발생한다. ( Time out / Dup retransmision 으로 감지 가능 )
Flow control같은 경우에는 Receiver가 얼만큼 달라고 말해서 간단했는데
이거는 상황에 따라 계속 변하니까 복잡하긴하다.
* Flow control = Sender Receiver 둘 사이의 Buffer 관련
* Congetion = 해당 네트워크 전체에 대한 처리율(Router)과 관련
Scenario 1
- 무제한 Buffer( = loss X ) Router
- 재전송 없음
- 두 Hosts
Q1. 둘 다 반반씩 쓰면 어떻게 되는가?
: 라우터의 활용도가 높아질수록
Delay가 늘어난다. 활용도가 최대라면 Delay도 최대
➡️ 무제한 Buffer는 상상에서만 가능한데, 그것도차 Delay가 많다면 ... ㅠ
Scenario 2
- 제한된 크기의 Router 하나 ( = Loss 발생 )
- 재전송도 해줘야 함
+ Application Layer에서는 보내는 것과 받는 것이 같다.
+ 하지만, Transport에서는 [ 원래 보내는 것 + 재전송 ] 까지 해야하므로 APP에서 주는 것보단 양이 많다.
📌 Idealization
: Perfect Knowledge
= Sender는 Loss가 나지 않도록, Buffer에 여유공간이 있을 때만 전송한다.
(언제 여유있는지 알고 보낸다.)
왜냐면 항상 Buffer가 꽉 차있을 때 보내다가 loss가 났기 때문에
따라서, 실제로는 Loss가 나서 재전송해야하므로 처리율은 조금 떨어진다.
근데 더 골때리는 건, 우린 Loss가 확인될 때만 재전송하는 게 아니다.
Timeout이 발생해도 재전송을 해야한다.
전송 중인데 Timeout으로 똑같은 게 들어가면
즉, Duplicated data가 처리율을 떨어뜨리기도 한다.
Scenario 3
- 여러 개의 Hosts
- 여러 Router
- 제한된 크기의 Router 하나 ( = Loss 발생 )
위와 같은 그림으로 이해하면 된다.
Q1 . App 층에서 보내는 양과 Network 층에서 보내는 양이 증가하면?
> 라우터에 더 많은 양을 차지할 것이기 때문에,
해당 라우터를 같이 쓰는 다른 Link가 보낼 수 있는 패킷의 양이 줄어든다.
ex) 빨간색에서 보내는 게 많으면, R2에서 파란색 선이 보낼 수 있는 게 줄어든다.
거의 처리율이 0까지 간다고 보면 된다.
Congestion control Insight
Congestion Control 방법 (2가지)
: Congestion Control 을 위해서는 네트워크나 통신 상황을 알아야 한다.
1) End - End Congestion Control
1) Segment 보냄
2) ACK 제대로 옴
= 문제가 없다는 것
Loss 나 Delay가 발생하면 어디에 문제가 있다는 것이다.
+ Network 상황에 대해서는 정보가 따로 없다.
그냥 ' 문제가 없다면 잘 돌아간다 ' 로 생각함
2) Network-assisted Congestion Control
라우터가 Host들에게 Feedback을 준다 ( ex. 지금 보내도 된다. 안 된다 )
근데 라우터는 라우팅을 해야하는데 이런 것까지 하기에는 좀 낭비가 있지 않나?
Overhead도 크다고 해서 주로 1번 방법으로 간다고 함
(출처)
한동대학교 고윤민교수님 - 컴퓨터 네트워크
'3학년 2학기 > 네트워크 (Network)' 카테고리의 다른 글
[ 네트워크 ] 16. Socket Programming 1 (0) | 2024.10.24 |
---|---|
[ 네트워크 ] 15. Transport layer : TCP ( Congestion Control ) (0) | 2024.10.21 |
[ 네트워크 ] 13. Transport layer : TCP (0) | 2024.10.14 |
[ 네트워크 ] 12. Transport layer : UDP(3) - Reliable Transfer (0) | 2024.10.10 |
[ 네트워크 ] 11. Transport layer : UDP(2) (0) | 2024.10.07 |