ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20140618 (3 Hand shake, 4 way Hand shake, 프로세스)
    부산IT학원/스마트컨트롤러 2014. 6. 18. 10:31

    83일차












    ------------------

    Network 이론

    ------------------




    --- 3 Hand Shake




    1. SYN Segment(Client의 Synchronization Information 전송): Client는 Source Port에 자신을 나타내는 Port Number를 넣고, Destination Port에는 Server를 가리키는 Port Number를 넣는다. Sequence Number에 Client의 ISN(Initialization Sequence Number)를 넣고, Acknowledgment Number는 0을 넣고, Flag는 SYN bit를 1로 설정하여 전송한다.

    2. SYN+ACK Segment(Server의 Synchronization Information 전송 + SYN Segment 수신 확인): Server는 Source Port에 자신의 Port Number를 넣고, Destination Port에는 Sender의 Port Number를 넣는다. Sequence Number에는Server의 ISN를 넣고, Acknowledgment Number에는 “Client의 ISN + 1”의 값을 넣고, Flag는 SYN 와 ACK bit를 모두 1로 설정하여 전송한다.

    3. ACK Segment(SYN Segment 수신 확인): Client는 첫번째 단계와 동일하게 Source Port와 Destination Port를 설정하고, Acknowledgment Number에는 “Server의 ISN + 1”의 값을 넣고, Flag는 ACK bit를 1로 설정하여 전송한다.



    다시 요약하면

    1. Seq 수를 random으로 생성,

        SYN Flag set하고 보냄.


    2. Ack를 Seq + 1로 하고,

        Seq를 random으로 생성,

        SYN, ACK Flag set하여 보냄.


    3. Ack를 Seq + 1로 하고,

        Seq를 Ack로 하고,

        ACK Flag set하여 보냄.



    문제점.

    - 서로 보낸 Seq, Ack 번호가 다를 경우 뭔가 잘못되었기 때문에 통신이 이루어지지 않는다.

    - client가 1번만 보내고 대기하게 되면 서버는 몇 초간 대기한다.

       엄청나게 많은 1번이 오면 서버가 멈춘다.

       (AF_RAW 옵션으로 ip spoofing으로 DOS 공격이 이런 경우이다.)









    --- 4 way Hand Shake



    3 hand shake는 TCP 통신을 시작할 때 절차이고,

    4 way hand shake는 TCP 통신을 종료할 때 절차이다.



















    -------------

    프로세스

    -------------



    --- 실행중에 있는 프로그램을 프로세스(Process)라고 부른다


    Windows 경우 작업관리자

    Linux 경우 ps 명령어로

    현재 실행 중인 프로세스 리스트를 볼 수 있다.




    --- fork


    자식 프로세스를 생성한다.


    #include <sys/types.h>

    #include <unistd.h>


    pid_t fork(void);



    리턴값

    성공시

    부모 프로세스 : 자식 프로세스의 프로세스 ID

    자식 프로세스 : 0


    실패시

    -1





    예제)





    One 이 한 번 출력되고 Two가 두번 출력되었다.


    9번 줄에 fork()함수가 호출되면서 프로세스가 두 개가 되었다.

    그래서 그 아래 소스는 두번씩 실행된다.






    --- getpid, getppid


    getpid 는 자신의 PID

    getppid 는 부모 프로세스의 PID를 얻음.


    #include <unistd.h


    pid_t getpid(void);

    pid_t getppid(void);



    리턴값

    성공시

    PID


    실패시

    발생하지 않음







    --- vfork

    fork와 유사한데 다른점은 자식이 끝내기 전에 부모는 실행을 멈춘다.


    #include <sys/types.h>

    #include <unistd.h>


    pid_t vfork(void);



    리턴값

    성공시

    부모 프로세스 : 자식 프로세스의 프로세스 ID

    자식 프로세스 : 0


    실패시

    -1





    예제)








Designed by Tistory.