2017. 10. 7. 20:59ㆍ카테고리 없음
#TCP와 UDP 작동 Layer
Transport Layer에서 host들 간에 TCP로 작동할지, UDP로 작동할지 결정을 한다.
그다음, OS에서 process들 간에 logical communication을 가능하도록 Network Layer가 작동된다.
# TCP vs UDP
#UDP
-Unreliable, unordered delivery
-No connection set up
-No congestion control, flow control
-Socket에서 dest IP 주소랑 port number만 확인함.
-No handshaking
-Error 발생시, checksum으로 확인하고 true면 올리고 false면 그냥 버림
#TCP
-Reliable, In-order delivery
-Congestion control, flow control
-Connection setup
-Socket에서 source IP,dest IP, source port number, dest port number 4개로 확인함. 왜냐면 ACK을 보내줘야하기 때문에.
-Reciver는 여태까지 잘받아온 ACK를 나타낼 수 있는 Cumulative ACK을 사용한다.
-TCP Connection을 위해서 TCP 3-way handshake를 거쳐야함. Connection 종료도 마찬가지 FIN msg형태로
Client |
Server |
1.TCP SYN msg를 보낸다. SYNbit =1, Seq num=x |
|
|
2.TCP SYNACK을 보낸다. SYNbit = 1, Seq num =y ACKbit = 1, ACKnum=x+1 |
3.SYNACK를 위한 ACK를 보내준다. ACKbit=1, ACKnum=y+1 |
|
|
4.Connection Established |
+) 왜 3 handshaking이 필요할까?
결론적으로 TCP는 양방향성 connection이다. 즉, sender와 receiver간의 data를 주고 받고 하는 것이다.
Client -> Server : Server야. 내가 data를 작은 거 보낼껀데, 잘 받을 수 있어?
Server -> Client : 응. 잘 받았어. 여기 너가보낸 거에 대한 ACK. 근데, 넌 내꺼 받을 수 있어? (현재, client->server로만 확인한 상황)
Client -> Server : 응. 너껏도 잘 왔드라. 여기 잘 왔다는 표시로 ACK줄게 (server->client도 잘 전송되었다는 걸 확인할 수 있음)
만약 2 handshaking이면, server가 client한테 잘 줄 수 있는지 확인이 불가능하다.
또한 4 handshaking이면, 3-handshaking으로도 충분히 가능하는 데, cost가 올라간다.
-Congestion Control
Sender가 지금 Congestion이 많다는 것을 어떻게 알 수 있을까?
1)Timeout - 일정시간 동안 ACK이 날라오지 않는다면, 심각하게 Network상황이 안좋다는 것을 알 수 있음.
2)Three duplicate ACKs - Timeout상황보다는 아니지만, 현재 Network상황이 좋지 않아서 순서대로 data가 오지 않는 상황
slow start : 초기에는 ACK당 MSS를 1씩 증가시켜서, 2^n으로 cwnd사이즈를 증가시킨다.
congestion avoidance : 일정 ssthresh를 지나면, ACK당 1/cwnd를 증가시켜 cwnd=cwnd+1/cwnd로 만든다.
Fast Recovery :
만약 Timeout 발생시, cwnd=0 ssthresh는 이전 값의 1/2로 만들고,
만약 Three duplicate ACKs 발생시, cwnd와 ssthresh는 이전 cwnd의 1/2로 만든다.