패킷 교환 방식으로 인해 일부 패킷이 손실될 수 있다
패킷마다 번호를 붙이고, 목적지에 도착했는지 확인한다
그리고 데이터를 주고받을 때 서버에게 데이터를 잘 받았다는 메시지를 전달한다
헤더 안에는 해당 데이터에 대한 정보가 담겨 있음
발신지 주소, 목적지 주소
시퀀스 번호
패킷이 순서대로 들어왔는지 확인하기 위한 공간
윈도 크기
플래그
패킷의 상태를 알리는 목적의 헤더 정보
URG, ACK, PSH, RST, SYN, FIN
ACK(Acknowledgement) : 앞서 받은 데이터를 잘 처리했다
SYN(Synchronize) : 연결 요청
FIN(finish) : 통신이 마무리되어 연결 해제 요청
만약, ACK=1, SYN=1 이라면 앞선 데이터를 잘 처리했고, 나도 상대방과 연결해도 되는지 묻는 메시지
서로 통신할 준비가 되었는지 확인하여 연결 오류로 인한 데이터 유실을 방지한다
[SYN_SENT] =SYN(연결요청)=> [SYN_RECEIVED]
[ESTABLISHED] <= ACK + SYN (응답 + 연결요청)=
=ACK(응답)=> [ESTABLISHED]
[FIN_WAIT] =FIN(연결종료)=> [CLOSE_WAIT]
<=ACK(응답)=
/* 미처 보내지 못했던 데이터를 보낸다*/
[TIME_WAIT] <=FIN(연결종료)= [LAST_ACK]
=ACK(응답)=> [CLOSED]
매번 전송한 패킷에 대해 확인 응답을 받은 뒤에 다음 패킷을 전송
=> 시간 오래 걸리고 효율이 좋지 않음
윈도우 크기 : 수신자가 한번에 처리할 수 있는 데이터 크기
처음 전송자와 수신자가 연결하는 3방향 핸드셰이크 과정에서 윈도 크기가 정해짐
전송자는 윈도우 크기 만큼 데이터를 순서대로 전달한다
수신자는 마지막으로 받은 데이터 번호를 전송자에게 전달한다
전송자는 수신자의 메시지 헤더에 적힌 번호를 확인해서 그 다음 순서부터 윈도 크기만큼 데이터를 다시 전달한다
=> 적절하게 처리 속도를 제어할 수 있다
네트워크 상황에 따라 데이터가 도달하는 속도가 다르고,
만약 이를 고려하지 않은 채
(네트워크가 복잡해서 속도가 느렸고 이로 인해 도착하지 않았음을)
보내지 않은 줄 알고 재전송하게 되면
가뜩이나 복잡한 네트워크가 더 복잡해진다
처음에는 데이터를 천천히 보내다가 수신자가 잘 보내는 것을 확인하면 속도를 점차 높인다
그러다 한참 전에 전달한 데이터까지만 받았다고 이야기하면
그때 네트워크가 혼잡하다는 사실을 인지하고 속도를 줄인다
속도를 얼마만큼 높이는지, 혼잡을 감지했을 때 얼마나 속도를 줄이는지에 따라 혼잡 제어 방법을 구분한다
전송자가 수신자에게 패킷을 하나씩 보낸 뒤 잘 도착했다는 응답을 받으면,
초기 시작은 윈도크기만큼 여기에 크기를 1개씩 증가시킴
혼잡하다고 판단되면 윈도 크기를 1/2로 줄인다
=> 전송 속도가 천천히 증가하기 때문에 초기 전송 속도를 높이는데 걸리는 시간이 길다
윈도 크기를 1로 시작해, 2배씩 증가시키고
혼잡하다는 판단이 씨으면 윈도 크기를 1로 급격히 줄인다
=> 시간이 지날 수록 많은 양의 데이터를 전달할 수 있다
현재 TCP에서는 처음에는 느린 시작을 사용하다가 특정 지점을 넘기면 합 증가/곱 감소로 변경하는 등
각 상황에 맞는 방법을 조합한 혼잡 제어 정책을 사용한다
신뢰성을 보장하지 않는다
-> 데이터 번호나 플래그와 같은 정보가 헤더에서 빠진다
=> 가볍다!
처음에 정한 속도 그대로 데이터를 전송한다
중간에 데이터 속도가 지연되지 않고 일정한 속도를 보장할 수 있다
하지만 많이 사용하면 네트워크가 혼잡해진다
ex) 스트리밍 방송, 온라인 게임
[IT엔지니어를 위한 네트워크 입문] 4장. 스위치 (0) | 2024.06.23 |
---|---|
[IT엔지니어를 위한 네트워크 입문] 3장. 네트워크 통신하기 (0) | 2024.06.23 |
[Socket] 소켓 통신의 흐름 (0) | 2024.02.23 |
[TCP/IP] IP에 대해 알아보자 (0) | 2024.02.17 |
[네트워크] 웹소켓 (0) | 2024.01.02 |
댓글 영역